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

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使