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

相关文章

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

MySQL 索引简介及常见的索引类型有哪些

《MySQL索引简介及常见的索引类型有哪些》MySQL索引是加速数据检索的特殊结构,用于存储列值与位置信息,常见的索引类型包括:主键索引、唯一索引、普通索引、复合索引、全文索引和空间索引等,本文介绍... 目录什么是 mysql 的索引?常见的索引类型有哪些?总结性回答详细解释1. MySQL 索引的概念2

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使