2

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

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 个(因为纹理绑定可能发生在两者之间),我真的处于关于如何正确指定countbasevertex参数的损失。

那么对于单个三角形,我只需要假设我需要指定计数 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 规范,但实际上没有任何东西可以正确地单独渲染选择单个三角形。

4

1 回答 1

3

明白了……我突然意识到,在从元素数组缓冲区中获取基础顶点之后,它被添加到索引中,而不是作为偏移量添加到从元素数组缓冲区中读取的位置。 ..哎哟。所以似乎我必须抵消indices参数而不是basevertex参数,并且似乎我现在得到了想要的结果。

于 2013-02-18T16:03:38.847 回答