【问题标题】:OpenGL render only a part of VBOsOpenGL 只渲染 VBO 的一部分
【发布时间】:2014-09-06 00:03:25
【问题描述】:

我有一个带有 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 的一个特殊三角形???

【问题讨论】:

    标签: opengl vbo


    【解决方案1】:

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

    你应该这样做:

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

    注意指定的偏移量,您也可以使用(void*)(3*sizeof(unsigned int)) 来执行此操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多