OpenGL 索引缓存对象EBO和线宽模式

2023-10-27 17:50

本文主要是介绍OpenGL 索引缓存对象EBO和线宽模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

索引缓存器

当绘制一些联系的图形的时候,通常有一些点是连续的,可以被重复使用的点。比如重合的点,我只要在内存中定义一次,然后在显卡缓存中的可以重复使用,只要告诉数据的位置即可。这里就用到了索引缓存器(EBO)。

这里需要注意两点:首先需要配置好VBO,然后才能使用EBO
代码如下:

#pragma once#include <QOpenGLWindow>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
class QOpenGLFunctions_3_3_Core;
//索引缓存对象的使用class EBOWnd : public QOpenGLWindow{Q_OBJECTpublic:EBOWnd();~EBOWnd();void initializeGL()override;void resizeGL(int w, int h)override;void paintGL()override;private:QOpenGLFunctions_3_3_Core* _openGLCore;GLuint _EBO;GLuint _VBO;GLuint _VAO;QOpenGLShaderProgram _shaderProgram;//着色器程序,所里系统所有的着色器
};
#include "EBOWnd.h"
#include <QOpenGLFunctions_3_3_Core>EBOWnd::EBOWnd(){
}EBOWnd::~EBOWnd(){
}void EBOWnd::initializeGL() {_openGLCore = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();/*** 首先把所有图形的点按照一定的顺序列出来,然后在列一个索引表,指明哪些数据是一组*/GLfloat ver[] = {0.5f,  0.5f, 0.0f, //第一象限0.5f, -0.5f, 0.0f, //第四象限-0.5f, -0.5f, 0.0f, //第三象限-0.5f,  0.5f, 0.0f, //第二象限};GLuint idexVer[] = {0, 1, 2, //数组中的第0/1/2三个点组成第一个三角形1, 2, 3  //第1/2/3组成第二个三角形};//创建VAO,用来记录各种数据属性_openGLCore->glGenVertexArrays(1, &_VAO);//绑定VAO_openGLCore->glBindVertexArray(_VAO);//创建EBO VBO_openGLCore->glGenBuffers(1, &_EBO);_openGLCore->glGenBuffers(1, &_VBO);//绑定EBO VBO_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, _VBO);_openGLCore->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _EBO);//传送数据_openGLCore->glBufferData(GL_ARRAY_BUFFER, sizeof(ver), ver, GL_STATIC_DRAW);_openGLCore->glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(idexVer), idexVer, GL_STATIC_DRAW);/*** 对VBO进行属性配置*/_openGLCore->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);//启用着色器_openGLCore->glEnableVertexAttribArray(0);//解绑VAO_openGLCore->glBindVertexArray(0);//解绑VBO_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, 0);//解绑EBO_openGLCore->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);/*** 着色器** 着色器属于动态编译*/QOpenGLShader vertexShager(QOpenGLShader::Vertex);//顶点着色器vertexShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/triangle.vert");QOpenGLShader fragmentShager(QOpenGLShader::Fragment);//片段着色器fragmentShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/triangle.frag");_shaderProgram.addShader(&vertexShager);_shaderProgram.addShader(&fragmentShager);_shaderProgram.link();
}void EBOWnd::resizeGL(int w, int h) {}void EBOWnd::paintGL() {//设置清除颜色,使用当前颜色,清除背景_openGLCore->glClearColor(0.6f, 0.6f, 0.6f, 1.0f);_openGLCore->glClear(GL_COLOR_BUFFER_BIT);//把着色器送入显卡缓存_shaderProgram.bind();_openGLCore->glBindVertexArray(_VAO);//会将它记忆的那些状态,相当于那几个函数执行一遍/***  第一个参数:绘制类型 三角形**  第二个参数:绘制点数,两三角形就是6个点**  第三个参数:数据类型,索引的值的类型 idexVer 为无符号整形**  第四个参数:设置为0*/_openGLCore->glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);update();
}

运行结果:
在这里插入图片描述

线框模式

我们重新调整一下点索引数组的顺序

GLuint idexVer[] = {0, 1, 2, //数组中的第0/1/2三个点组成第一个三角形,顺时针2, 0, 3  //第1/2/3组成第二个三角形,逆时针};

解绑VAO之前调用这个函数,可以看到
其中第一个参数有多个选项:
#define GL_FRONT 0x0404
#define GL_BACK 0x0405
#define GL_FRONT_AND_BACK 0x0408
分别是前、后、前和后。

那什么才是一个多边形的前和后呢?

 在OpenGL中一个面的法向量,与绘制这个面时的点的顺序有关;以屏幕为例,如果一个多边形的点是顺时针绘制的,则法向量的从屏幕向里的,如果是逆时针在法向量的方向是向外的。符合右手定则。法向量向外的称为前面,法向量向内的称为后面
_openGLCore->glPolygonMode(GL_BACK, GL_LINE);

可以看一下效果:
在这里插入图片描述

aaa

这篇关于OpenGL 索引缓存对象EBO和线宽模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/287333

相关文章

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数