OpenGL只渲染VBO的一部分

时间:2014-09-05 12:33:24

标签: opengl vbo

我有一个带有IBO的VBO,我想渲染第二个三角形,在下一个渲染步骤中,我想渲染第三个三角形。

我认为渲染第二个三角形的正确方法是调用

glDrawArrays(GL_TRIANGLES, 
             3,  // indexArray[3] is start
             3); // take 3 indices (from index 3..5 --> second triangle)

第一个三角形可以正常工作。但是当我想渲染另一个三角形时,VBO的参数将被解释不正确。

我的VAO的定义如下所示

glGenVertexArrays(1, out VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO.V_ID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBO.E_ID);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, false, 12 * sizeof(float), 0);
glBindAttribLocation(shaderID, 0, "InUV");
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, true, 12 * sizeof(float), 2 * sizeof(float));
glBindAttribLocation(shaderID, 1, "InColor");
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, true, 12 * sizeof(float), 6 * sizeof(float));
glBindAttribLocation(shaderID, 2, "InNormal");
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, false, 12 * sizeof(float), 9 * sizeof(float));
glBindAttribLocation(shaderID, 3, "InVertex");

glBindVertexArray(0);

当我打电话

glDrawElements(GL_TRIANGLES, VBO.length, GL_UNSIGNED_INT, 0);

该对象将正确呈现。

我是以错误的方式使用glDrawArrays还是有另一种方法来渲染VBO的一个特殊三角形?

1 个答案:

答案 0 :(得分:3)

glDrawElementsglDrawArrays不同,glDrawArrays会忽略索引缓冲区

你应该这样做:

usigned int *NULLptr=0;
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (void*)(NULLptr+3));

注意指定的偏移量,您也可以使用(void*)(3*sizeof(unsigned int))

进行此操作