注:参考自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.pngimage.png
重点:
第一步:先初始化VBO(glGenBuffers)
第二步:Bind数据,并告诉GL如何解析顶点数据(glBindBuffer,glBufferData, glVertexAttribPointer)
第三步:启用顶点属性 (glEnableVertexAttribArray)
第四步:释放VBO (glDeleteBuffers)
函数解释:
- 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)。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。(注: 这个参数的意思简单说就是从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。
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
VAO 和 VBO的关系
一个VAO可以包含多个VBO。
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=avoxt0drfv91
网友评论