簡體   English   中英

索引,glDrawElement和/或其他繪制大頂點數組的方法

[英]Indicies, glDrawElements and/or other methods of drawing big vertex arrays

我正在嘗試顯示一個等距曲面,該等距曲面是使用行進立方體算法構建的,我想它會生成一組三角形。 我是圖形編程的完全業余愛好者,但是我在理解有效繪制圖形的幾種方法方面很掙扎。

我想到的是使用glVertexPointer-glDrawElement構造在一個調用中全部繪制出來。 但是,后者要求我知道索引,而我顯然不知道它們。 此外,我實際上不確定它們的用途:我認為它們只是一個索引,驅動程序將使用它們的順序,以及通過排除多次出現的相同頂點來節省內存的方法。

那么,我對指標目標的看法是否正確?解決問題的正確方法是什么?

如果要一次調用就可以繪制一件大東西,可以通過提供繪制功能2件來完成:

頂點數組

您猜對了,其中有一組頂點。 3D空間中的坐標。 它們不必按任何特定順序排列。

索引數組

這是頂點數組中的索引數組。 該數組告訴您的驅動程序頂點的順序(什么與什么相連)。

您應該上載所有頂點,然后將它們變成索引數組中的三角形。

如果您不需要索引,那么...不要使用索引! 是的,如果多次使用同一頂點,則可以使用它們使渲染更有效率。 但是它們完全是可選的。

在沒有索引的情況下渲染時使用的draw調用是glDrawArrays() 這將根據傳遞給繪制調用的圖元類型,以其自然順序使用頂點緩沖區中的頂點。 例如,使用GL_TRIANGLES ,它將在緩沖區的位置(0,1,2)處繪制一個帶有頂點的三角形,在頂點(3,4,5)上繪制一個三角形,等等。

因此,在等值面算法中,每次生成三角形時,您都可以簡單地計算3個頂點,並將它們附加到最終存儲在頂點緩沖區中的頂點列表中。 然后使用glDrawArrays(GL_TRIANGLES, ...)繪制整個內容, glDrawArrays(GL_TRIANGLES, ...)

現在,在覆蓋表面的網格中,相同的頂點平均被大約6個三角形共享(請查看常規網格以查看此數字的得出方式)。 因此,如果為每個三角形分別生成頂點,則相同的頂點大約會出現6次,從而導致大量不必要的內存使用和頂點處理時間。

這就是索引的用處。您可以使用的一種方法是,對於網格的每個邊緣,您可以跟蹤邊緣上的等值面頂點是否已經創建,如果存在則存儲其索引。 然后,在生成三角形時,每當需要網格邊緣的頂點時,如果邊緣還沒有頂點,就可以創建一個新頂點(帶有新索引),或者使用已經創建的頂點的索引。 然后,將生成的索引序列存儲在索引緩沖區中,並使用glDrawElements(GL_TRIANGLES, ...)繪制。

上面的一個較小變化是,您首先在所有網格邊上循環,計算與等值面相交的邊的所有頂點,然后再次存儲每個邊的頂點索引。 然后,當您遍歷網格多維數據集以生成三角形時,只需從其相交的每個邊中獲取頂點索引即可。

暫無
暫無

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

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