如何使用glDrawElementsBaseVertex从VBO网格中选择单独的三角形?

时间:2013-02-18 15:48:39

标签: opengl opengl-3

所以我有一个简单的立方体“网格”:

6个立方体面是12个三角形,因此36个“顶点”被组织为36个索引,重复使用8个独特的顶点位置,6个独特的顶点法线和4个独特的顶点 - texcoords。

这个索引网格存储在一个VBO / IBO对中,在它之前或之后可能有其他网格,因此这里建议使用base-vertex。

现在,我可以在一次绘制调用中完全正确地渲染完整的多维数据集,如下所示:

gl.DrawElementsBaseVertex(
    gl.TRIANGLES, gl.Sizei(36), gl.UNSIGNED_INT,
    gl.PtrOffset(nil, uintptr(myMeshIndexBufOffset)),
    gl.Int(myMeshIndexBufBaseIndex))

然而,现在我只想绘制“前4个三角形”(又称“第一个”2个立方体面) - 有4个绘制调用而不是1(因为纹理绑定可能发生在其间)< / strong>我真的不知道如何正确指定 count basevertex 参数。

对于一个三角形,我只是假设我需要指定一个3的数量。对于12个三角形,我必须使用36来成功渲染完整的立方体,所以3一个三角形是有道理的。然后,它从元素数组中选择3个“索引条目”(此处定义为每个条目三个uint32)。正确的吗?

但我无法弄清楚 - 无论是通过逻辑推理还是通过实验 - 现在如何在这里指定基本顶点。具体来说,我需要将自己的偏移量添加到已知的“立方体网格基础索引”中。如果我在一个循环中分别对glDrawElementsBaseVertex()所有单独的12个三角形进行处理:

for i := 0; i < 12; i++ {
    gl.DrawElementsBaseVertex(
        gl.TRIANGLES, gl.Sizei(3), gl.UNSIGNED_INT,
        gl.PtrOffset(nil, uintptr(myMeshIndexBufOffset)),
        (i * fooBar) + gl.Int(myMeshIndexBufBaseIndex))
}

那么......有没有人知道上面的 fooBar 到底应该代表什么?

这很烦人:真的,理论上我非常确定 完全理解glDrawElementsBaseVertex specification,但实际上没有任何东西可以正确分别渲染选择的单个三角形。

1 个答案:

答案 0 :(得分:3)

知道了...我刚刚意识到,在从元素数组缓冲区中取出后,基本顶点被添加到索引,而不是作为偏移添加到< strong> position 从中读取元素数组缓冲区... ouch。所以我似乎必须偏移 indices 参数而不是 basevertex 参数,现在看来我现在得到了预期的结果。