2010-05-16 64 views
3

我有一個程序,繪製一些地形,並模擬流過它的水(以便宜和簡單的方式)。並行構建OpenGL模型?

更新水容易使用OpenMP並行化,所以我可以每秒更新約50次。問題是,即使有少量的水,我的每秒抽吸量也非常低(從5開始,一旦有大量的水就下降到2左右)。

這不是視頻卡的問題,因爲地形比較複雜,而且畫得很快,所以boost::timer告訴我,如果關閉水面,我可以每秒獲得無限繪製。它可能與內存帶寬有關(因爲我假設模型停留在卡上,並且不必每次都傳輸)。

我擔心的是,在每次平局中,我打電話glVertex3f()大約一百萬次(最大尺寸爲450 * 600,每個頂點4個),並且完全按順序完成,因爲Glut不會讓我並行調用任何東西。

所以..是否有某種方法可以並行構建列表,然後將它同時傳遞給OpenGL?或者使其更快速地繪製它的其他方式?我是否使用了錯誤的方法(除了明顯的「使用更少的頂點」)?

回答

8

您的並行繪圖方法與您應該做的完全相反。 圖形硬件本質上是平行的,並且在儘可能短的時間內儘可能多地呼叫圖形並沒有多大用處。將數據發送到可進行並行處理的硬件的單個巨大調用非常重要。你所有的glVertex()電話完全相反。

正如喬治指出:伴隨着glDrawElements()glDrawArrays()glVertexPointer()是非常適合您的情況,如果這些是不夠的,你應該採取的一步走到頂點緩衝對象。另一種方法是使用着色器直接計算GPU。在所有這些方法中,您幾乎可以免費獲得GPU中的幻燈片。

+0

這似乎正是我所期待的。謝謝。 – 2010-05-18 23:44:04

7

我很擔心的是,在每一個平局,我打電話glVertex3f()的一萬倍左右

glVertexPointer()看看。

4

除了glVertexPointer之外,您還應該看看ARB_vertex_buffer_object,它支持大多數現代硬件,並且在某些情況下可以比Vertex Arrays更快。

+0

而且還兼容OGL 3.0。這絕對是最現代化的解決方案。 – 2010-05-17 00:33:36

+0

看起來很有趣。我可能會使用其他解決方案,因爲我不知道與舊硬件的兼容性,但這聽起來也很有趣。 – 2010-05-18 23:46:03

+1

查看NVIDIA和ATI的擴展註冊表,您應該能夠確定它們何時推出。這實際上是一個相當古老的功能,至少可以追溯到5年。我認爲它也支持所有的OpenGL ES 2.0目標。 – greyfade 2010-05-19 17:49:41

2

glVertex()是extreemly低效率。我甚至不使用glVertex()繪製單個紋理四邊形(一個2D圖像)。
相反,這裏是一些代碼,應該更容易:

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3,GL_FLOAT,0,vertCoords); 
glClientActiveTextureARB(GL_TEXTURE0_ARB); 
glTexCoordPointer(2,GL_FLOAT,0,texCoords); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glNormalPointer(GL_FLOAT,0,vertNorm); 
glDrawElements(drawtype,tCount*3,GL_UNSIGNED_INT,tris); 

另一種方法是使用VBO的卻是另一個故事。
我希望它能幫助你完成你的項目。如果您還有其他問題,請詢問。我很樂意回答關於OpenGL的問題。