簡體   English   中英

並行構建OpenGL模型?

[英]Build OpenGL model in parallel?

我有一個程序可以繪制一些地形並模擬流過它的水(以便宜又簡單的方式)。

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

這對視頻卡來說不是問題,因為地形更加復雜並且繪制得如此之快以至於boost::timer告訴我,如果我關掉水,我每秒都會得到無限遠。 它可能與內存帶寬有關(因為我假設模型保留在卡上而不必每次都被轉移)。

我關心的是,在每次抽獎時,我稱glVertex3f()大約一百萬次(最大尺寸為450 * 600,每個頂點4個),並且完全按順序完成,因為Glut不會讓我調用任何東西在平行下。

那么..是否有某種方法可以並行構建列表然后將其一次性傳遞給OpenGL? 或者其他一些方法讓它更快地畫出來? 我使用了錯誤的方法(除了明顯的“使用較少的頂點”)?

您並行繪制的方法與您應該做的完全相反。 圖形硬件本質上是並行的,並且嘗試在很短的時間內盡可能多地調用它就沒有多大用處。 重要的是進行單個大量調用,將數據發送到可以進行並行處理的硬件。 你所有的glVertex()調用恰恰相反。

正如Georg指出的那樣:伴隨glDrawElements()glDrawArrays() glVertexPointer()非常適合您的情況,如果這些還不夠,您應該采取升級到頂點緩沖對象。 另一種方法是使用着色器直接計算GPU。 在所有這些方法中,你幾乎可以免費獲得GPU中的並行性。

我關心的是,每次抽獎時,我都會將glVertex3f()稱為大約一百萬次

看一下glVertexPointer()

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

glVertex()極其低效。 我甚至不使用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的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM