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对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给