这是否值得麻烦(性能方面)?
可能是的,但仍然尝试分析。
你要找的是实例化渲染,看看glDrawElementsInstanced和glVertexAttribDivisor。
您要做的是将通用立方体的 8 个顶点(以原点为中心)存储在一个缓冲区中,并将每个立方体中心的坐标存储在另一个顶点属性缓冲区中。
然后您可以使用glDrawElementsInstanced 绘制 N 个立方体,从第一个缓冲区获取顶点,并使用存储在第二个缓冲区中的特定位置在着色器中转换它们。
类似这样的:
glVertexAttribPointer( vertexPositionIndex, /** Blah .. */ );
glVertexAttribPointer( cubePositionIndex, /** Blah .. */ );
glVertexAttribDivisor( cubePositionIndex, 1 ); // Advance one vertex attribute per instance
glDrawElementsInstanced( GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices, NumberOfCubes );
在您的顶点着色器中,您需要两个属性:
vec3 vertexPosition; // The coordinates of a vertex of the generic cube
vec3 cubePosition; // The coordinates of the center the specific cube being rendered
// ....
vec3 vertex = vertexPosition + cubePosition;
显然,您还可以有一个缓冲区来存储每个立方体的大小,或者另一个用于方向的缓冲区,这个想法保持不变。