参考LearnOpenGL:主页 - LearnOpenGL CN
- 配置GLFW
- 创建双缓冲窗口:使用双缓冲,可以使你先将计算的中间结果存放在另一个缓冲区中,但全部的计算结束,该缓冲区已经存储了完整的图形之后,再将该缓冲区的图形数据一次性复制到显示缓冲区。
- 基本的渲染流程:
渲染管线参考:OpenGL学习笔记 (一)- 综述、渲染管线-腾讯云开发者社区-腾讯云
顶点着色器:做MVP变换,将输入的局部坐标变换到世界坐标、观察坐标和裁剪坐标。
图元装配:把点变成图元(点,线,多边形)。
光栅化:对图元进行“像素化”。如果使用了纹理,这部分也会执行纹理坐标的计算。
片段着色器:主要功能为通过重复执行(每片元一次)将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来送入后继阶段。
OpenGL中VAO,VBO创建,绑定顺序:
参考:https://www.cnblogs.com/zhoug2020/p/16465692.html
在OpenGL中,需要先绑定VAO,绑定后的VAO会自动(?)保存后续绑定的VBO的数据和解释方式。
//创建VBO,VAO
unsigned int VBO, VAO;
glGenBuffers(1, &VBO);
glGenVertexArrays(1, &VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(VAO);
//声明哪个位置,如何解释
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
//启用顶点属性,默认是禁用的
glEnableVertexAttribArray(0);
//glGenVertexArrays(1, &VAO);
//glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
详细来说(参考上面的代码),感觉是:首先生成VAO的名称,绑定到顶点数组对象,后续所有创建出来的VBO在glVertexAttribPointer解释后,会被保存到VAO中,在shader中就可以用location选择属性,同一个VBO可以有多个属性解释后保存到VAO中,VAO中也可以有多个VBO,多个VBO的情况下,即使参数数量不同也不会报错。例如VBO1有三项数据(每项一个属性,location = 0),VBO2有两项数据(每项一个属性,location = 1)。绑定VAO绘制时,在VBO1第三项数据输入顶点着色器时,localtion = 1没有值【或者是读取越界?】,纯属猜测,欢迎指正^ ^)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0):第一个参数就是location,第二个参数是每个参数值的数量,这里是位置vec3就是3,第五个参数是每每个顶点信息的字节大小(注意不是参数的,比如一个顶点,前三个float值是位置,接着是2个float值的纹理坐标,那这里第五个参数就是5 * sizeof(float);
这里简单试了一下,VBO1是顶点颜色(3项),VBO2是顶点坐标(6项),可以看到一个三角形是没有颜色的,但两个三角形都绘制出来了。
如果VBO1有4项,也就是之前没颜色的三角形一个顶点有了颜色,结果如下:
应该就是和前面推测的处理方法一样,没有的话应该就用默认值了(?)
EBO
简单来说,就是用索引节省空间^ ^;