1、什么是OpenGL?

Open Graphics Library,它是一个由Khronos组织制定并维护的规范
OpenGL核心是一个C库,同时也支持多种语言的派生

核心模式

也叫可编程管线,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图像编程,蓝色部分是编程的,通过这一条流水线,最后形成一个OpenGL程序

我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何绘图

2、OpenGL对象

一个对象是指一些选项的集合,代表OpenGL状态的子集,例如:我们可以用一个对象来代表绘图窗口的设置:设置它的大小,至此的颜色位数等等,通常把OpenGL上下文比作一个大的结构体,这个大的结构体中包含很多子集

3、绘制三角形

paintGL:渲染OpenGL场景,widget需更新的调用
resizeGL:设置OpenGL视口、投影等,widget调整大小
initializeGL:设置OpenGL资源和状态,第一次调用上面之前调用

QOpenGLFunctions_4_5_Core 提供OpenGL版本核心模式的所有功能,是对OpenGL函数的封装,initializeOpenGLFunctions:初始化OpenGL函数,将Qt里的函数指针指向显卡的函数

顶点着色器:
它会在GPU上创建内存,用于储存我们顶点数据,通过顶点缓冲对象(vertex Buffer Objects VBO)管理,顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER。
配置OpenGL如何解释这些内存,通过顶点数组对象(VAO)管理(类型唯一),数组里的每一项都对应一个属性的解析,VAO并不保存实际数据,而是放顶点结果定义


绘制一个三角形

#include "AXBopenglWidget.h"
#include <string>
unsigned int VAO, VBO,EBO;
float vertices[] = {-0.5f,-0.5f,0.0f,0.5f,-0.5f,0.0f,0.0f,0.5f,0.0f,
};const char* f = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n void main()\n"
"{\n"
"gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
"}\0";const char* f1 = "#version 330 core\n"
"out vec4 FragColor;void main()\n"
"{\n"
"FragColor=vec4(1.0f,0.5f,0.2f,1.0f);\n"
"}\0";unsigned shaderProgram;AXBopenglWidget::AXBopenglWidget(QWidget *parent): QOpenGLWidget(parent)
{}AXBopenglWidget::~AXBopenglWidget()
{glDeleteBuffers(1, &VBO);glDeleteVertexArrays(1, &VAO);glDeleteProgram(shaderProgram);doneCurrent();
}void AXBopenglWidget::initializeGL()
{initializeOpenGLFunctions();// 创建VAO、VBO
//  unsigned int VAO, VBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);// 绑定VBO和VAO对象glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);// 为当前绑定到target的缓冲区对象创建一个新的数据存储glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 告诉显卡如何解析,第0个值,每个值是float,不需要标准化,每个步长glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);// 开启VAO管理的第一个属性值glEnableVertexAttribArray(0);// 释放glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);// 创建着色器unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1 ,&f, NULL);glCompileShader(vertexShader);// 片段着色器unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &f1, NULL);glCompileShader(fragmentShader);// 链接shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 删掉glDeleteShader(vertexShader);glDeleteShader(fragmentShader);
}void AXBopenglWidget::resizeGL(int w, int h)
{}void AXBopenglWidget::paintGL()
{glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);
}

绘制矩形(通过修改数据,使用EBO,其他代码不需要修改)

float vertices[] = {0.5f,0.5f,0.0f, // top right0.5f,-0.5f,0.0f, // bottom right-0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f,
};unsigned int indices[] = {0,1,3,1,2,3,
};// 创建EBO(在绑定VAO下进行创建EBO)
glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices),indices, GL_STATIC_DRAW);// 从EBO中拿数据(之前从VBO中拿数据改成从EBO中拿)
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

QT OpenGL(一 VAO、VBO、EBO使用)相关推荐

  1. OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...

  2. VAO, VBO, EBO的创建顺序和解绑顺序

    创建顺序:VAO➡VBO➡EBO // VAOglGenVertexArrays(1, &VAO);glBindVertexArray(VAO);// VBOglGenBuffers(1, & ...

  3. OPenGL 学习笔记之 VAO VBO EBO 以及SHADER 并使用其绘制三角形

    译注 在学习此节之前,建议将这三个单词先记下来: 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 索引缓冲对象:Eleme ...

  4. OpenGL VAO VBO EBO(IBO)的绑定、解绑问题

    文章目录 前言 VBO 链接顶点属性 EBO(IBO) VAO 绑定顺序 解绑顺序 前言 首先感谢知乎的一篇文章,解答了我的疑惑,在此记录一下心得. 那么我们先简单介绍一下这三个对象,以及一些必要操作 ...

  5. QT+OpenGL模型加载 - Assimp

    QT+OpenGL模型加载 - Assimp 本篇完整工程见gitee:OpenGL 对应点的tag,由turbolove提供技术支持,您可以关注博主或者私信博主 模型加载 先来张图: 我们不大可能手 ...

  6. VAO VBO IBO的理解

    VAO & VBO VAO是一个对象,一个VAO可以包含都多个VBO,是一种关联关系 顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何随后的顶 ...

  7. OpenGL图形渲染管线、VBO、VAO、EBO概念及用例

    OpenGL图形渲染管线.VBO.VAO.EBO概念及用例_牧野的博客-CSDN博客 图形渲染管线(Pipeline) 图形渲染管线指的是对一些原始数据经过一系列的处理变换并最终把这些数据输出到屏幕上 ...

  8. Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  9. OpenGL ES之VBO、EBO与VAO的说明和使用

    一.VBO 和 EBO VBO(Vertex Buffer Object)是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VAO 和 EBO 实际上 ...

最新文章

  1. 某程序员为方便老婆工作,写了一些小工具给老婆用!如今老婆要离职,公司老板却要求必须把工具留下!网友:跟他收费!...
  2. 【浙大软件学院机试】深度优先搜索、并查集和优先级队列知识点(Python实现)
  3. QT关联容器QMap,QHash的Key值自动排序问题
  4. c++ 用指针将函数作为参数传参
  5. nginx常用功能全揭秘(内附福利!!!)
  6. 碳中和背景下中国水泥行业发展预测与投资价值分析报告2022-2028年版
  7. python声音分类_Python音频信号分类MFCC特征神经网络
  8. linux共享内存的定义,共享内存是什么意思 Linux系统如何共享内存
  9. yml配置文件中存在@无法识别,报错:found character ‘@‘ that cannot start any token. (Do not use @ for indentation)
  10. mybaties总结+hibernate总结
  11. 【Openstack】实录手动部署Openstack Rocky 双节点(3)- Glance
  12. centos8安装mysql5.5_CentOS 6.8 编译安装MySQL5.5.32 (二 多实例)
  13. numpy—np.argpartition
  14. java实现socket.io客户端功能
  15. 高负载高并发网站架构分析
  16. 可用于保健食品的中药名单,卫生部关于进一步规范保健食品原料管理的通知...
  17. GIT修改用户名——idea提交git用户名/名字不正确
  18. 令人生畏的源码,到底该怎样看?
  19. 用循环不定式来证明冒泡排序的正确性
  20. 2008年上半年系统分析师上午英语试题分析与参考答案

热门文章

  1. 【Vue项目复习笔记】详情页的展示
  2. ArcGIS Pro试用许可申请
  3. Thinkpad E450c进入BIOS
  4. 虚拟动力数字人技术亮相第六届文创产业大会,探见元宇宙 驱动新文创
  5. 怎么用显卡计算_初试CUDA,入门显卡实现两千倍加速
  6. 腾讯云函数免费搭建onedrive网盘
  7. 解决[“usingcomponents“][“van-button“]: “@vant/weapp/button/index“ 未找到:
  8. 又一恐怖技能!卡耐基梅隆大学发布超强智能体,炸翻科研圈
  9. clion:输出中文乱码终极解决方案
  10. python常用图形绘图(matplotlib,pyecharts)