注:参考自bilibili系列视频,OpenGL 从入门到成魔-第4章-VAO 和 VBO https://www.bilibili.com/video/BV1zt4y1C7dh
OpenGL中的坐标系
1.X轴方向,右; 2.Y轴方向,上; 3.Z轴方向,向屏幕内,Z轴值越小,离我们眼睛越近
image.png
落在这个立方体范围内的点可以显示出来,之外的就不显示。
构造三角形顶点
image.png
三角形三个顶点分别为 (0,1,0) (-1,-1,0) (1,-1,0)
VBO的函数调用
image.png
image.png
- glGenBuffers(1, &VBO) 生成一个buffer,VBO初始化,第一个参数是buffer数量,第二个是要初始化的VBO指针。
- glBindBuffer(GL_ARRAY_BUFFER, VBO); 第一个参数buffer类型,第二个参数是buffer。告诉openGL,当前操作的VBO是哪个
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 复制顶点数组到缓冲中供OpenGL使用
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); 告诉OpenGL该如何解析顶点数据(应用到逐个顶点属性上)
- 第一个参数指定我们要配置的顶点属性。还记得我们在顶点着色器中使用layout(location = 0)定义了position顶点属性的位置值(Location)吗?它可以把顶点属性的位置值设置为0。因为我们希望把数据传递到这一个顶点属性中,所以这里我们传入0。
- 第二个参数指定顶点属性的大小。顶点属性是一个vec3,它由3个值组成,所以大小是3。
- 第三个参数指定数据的类型,这里是GL_FLOAT(GLSL中vec*都是由浮点数值组成的)。
- 下个参数定义我们是否希望数据被标准化(Normalize),即归一化。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE。
- 第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性组之间的间隔。由于下个组位置数据在3个float之后,我们把步长设置为3 * sizeof(float)。
image.png
- 最后一个参数的类型是void*,所以需要我们进行这个奇怪的强制类型转换。它表示位置数据在缓冲中起始位置的偏移量(Offset)。由于位置数据在数组的开头,所以这里是0。
- glEnableVertexAttribArray(layout); 以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的。这里参数值应为0,因为在第三步中设置了将数据传递到位置为0的顶点属性中。顶点属性(Vertex Attribute)就是每个输入变量。
- glDeleteBuffers() 释放VBO
VAO
image.png
- glGenVertexArrays(1, &VAO) 创建
- glBindVertexArray(VAO) 绑定当前使用的VAO。由于OpenGL是个状态机,当绑定当前VAO之后,后面的VBO操作自然而然的都是在该VAO上进行的。
- glDeleteVertexArrays 释放VAO