是,即使是值得的麻煩(性能明智)?
可能是的,但儘管如此。
你在找什麼是實例化渲染,看看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;
當然,你也可以有一個緩衝存儲每個立方體的大小,或者另一個用於方向,理念保持不變。
只是把它擺在那裏,一個也可以使用幾何着色器(因爲openGL的3.2)生成的立方體,但它可能不會是這樣一個很好的解決方案的性能,明智的,特別是對於大量的冰塊。稍微老一點的例子(贊成實例)http://www.pixelnerve.com/v/2010/04/03/mass-cube-rendering/ – Bikush