所以我有一个简单的立方体“网格”:
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 个(因为纹理绑定可能发生在两者之间),我真的处于关于如何正确指定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 规范,但实际上没有任何东西可以正确地单独渲染选择单个三角形。