根据LearnOpenGL的教程学习而来,有很多不懂的地方,现根据自己的理解和参考各位大大网络上的分享,记录如下,给自己一个回顾的机会,也希望能够惠及他人
VBO就是用来管理存储在GPU的显存上的顶点内存=VBO代表着我们定义的顶点。
这样做的好处就是我们可以一次性发送大量顶点数据到显卡上,而不用每次发送一个。从CPU发送数据到显卡可是很慢的;因此我们也需要尽可能多地把所有顶点数据给VBO
gluint VBO; //定义一个无符号整形VBO对象,其值为其ID
glGenBuffers(num, &VBO);//分配num个缓冲给VBO
glBindBuffer(GL_ARRAY_BUFFER,VBO);//将VBO对象绑定到顶点缓冲
从此起,任何作用于顶点缓冲的操作,都会配置当前绑定的缓冲(VBO)。相当于状态设置。
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数:
unsigned int EBO;
glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
如果代码中需要索引来渲染,采用了EBO时,则需要用glDrawElements函数来代替glDrawArrays函数,来指明我们从索引缓冲渲染
在使用glDrawElements时,我们会使用当前绑定的索引缓冲对象中的索引进行绘制:
gLuint VAO;
glGenVertexArrays(1, &VAO); // 生成一个VAO
glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
//顶点属性默认是禁用的
// 0,1,2…代表着色器的input的location,分别代表顶点位置,顶点颜色,顶点纹理坐标;
// 0,1,2也是顶点属性的位置值
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, vertexes);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, colores);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, texCoordes);
//为属性0,1,2...指定相应的数据
glVertexAttribPointer函数:
每个顶点属性从一个VBO管理的内存中获得它的数据,而具体是从哪个VBO(程序中可以有多个VBO)获取则是通过在调用glVetexAttribPointer时绑定到GL_ARRAY_BUFFER的VBO决定的
因此不同的VBO应该这样使用:
glBindBuffer(GL_ARRAY_BUFFER, vertexVBO); // 绑定位置VBO到当前的VAO上
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glBindBuffer(GL_ARRAY_BUFFER, colorVBO); // 绑定颜色VBO到当前的VAO上
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glBindBuffer(GL_ARRAY_BUFFER, textureVBO); // 绑定纹理VBO到当前的VAO上
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));