2014-07-11 67 views
1

我正在遷移我們的圖形,從使用舊的固定管道功能到使用可編程管道。我們最簡單的模型只是空間點的集合,每個點可以用不同的形狀表示。其中一個是立方體。OpenGL避免多次調用glDrawElements

我立足我的代碼開來了OpenGL OpenGL超級立方體example

在這個例子中的立方體被放置在一定程度上隨機的地方,而我將有一個固定的點着空間中的點。我想知道是否有辦法將該列表傳遞給我的着色器,以便在每個點繪製一個多維數據集,並且每次循環訪問列表並調用glDrawElements。這甚至是值得的麻煩(性能明智)?

PS限制在OpenGL的3.3功能。

回答

5

是,即使是值得的麻煩(性能明智)?

可能是的,但儘管如此。

你在找什麼是實例化渲染,看看glDrawElementsInstancedglVertexAttribDivisor

你想要做什麼是存儲的通用立方體(中心原點)在一個緩衝的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; 

當然,你也可以有一個緩衝存儲每個立方體的大小,或者另一個用於方向,理念保持不變。

+0

只是把它擺在那裏,一個也可以使用幾何着色器(因爲openGL的3.2)生成的立方體,但它可能不會是這樣一個很好的解決方案的性能,明智的,特別是對於大量的冰塊。稍微老一點的例子(贊成實例)http://www.pixelnerve.com/v/2010/04/03/mass-cube-rendering/ – Bikush

0

在你的例子中,每個立方體每幀使用自己的模型矩陣。 如果你想保持這一點,你需要多個drawElements調用。 如果某些立方體不移動(不需要每幀模型矩陣),則應將這些立方體合併爲一個VBO。

相關問題