2015-12-02 121 views
0

在使用着色器的OpenGL中,我想渲染兩個對象,這兩個對象是作爲兩個網格加載的。每個對象都由一組頂點位置,一組頂點顏色和一組三角形的頂點索引表示。使用OpenGL着色器渲染多個對象

我可以用三種方法來繪製這兩個對象。最佳做法是什麼?

1)我將兩個對象的頂點位置連接成一個長頂點數組,頂點顏色和頂點索引相似。然後我創建一個頂點位置緩衝區,一個頂點顏色緩衝區和一個索引緩衝區。在渲染時,我隨後撥打glBindBuffer(...)glDrawElements(...)

2)我將兩個對象的頂點位置連接成一個長頂點數組,頂點顏色類似。然後我創建一個頂點位置緩衝區和一個頂點顏色緩衝區。當渲染時,我接着撥打glBindBuffer(...)glDrawElements(...)兩個電話,每個對象一個。

3)我創建了兩個頂點位置緩衝區,兩個頂點顏色緩衝區和兩個索引緩衝區。當渲染時,我接着撥打glBindBuffer(...)glDrawElements(...)兩個電話,每個對象一個。

謝謝!

+0

它真的只有兩個物體在渲染嗎?或者你只是使用這個數字來簡化解釋? –

+0

是的,它是兩個CAD對象。兩者都是我得到的網格。我想在同一個視口中渲染這兩個對象。 – Karnivaurus

回答

1

OpenGL優化的一般規則是儘量減少狀態變化的次數。綁定緩衝區是一種狀態變化。

所以,所有其他的東西是相等的,#1可能是最快的。

然而,它並不總是特別有用。通常,不同的對象相對於彼此具有不同的變換。所以通常情況下,你需要在渲染對象之間改變一些狀態,所以#1不是一個選項。即使如此,您也不必訴諸於選項2.您可以使用與選項1相同的緩衝區設置,但只需發出兩個繪圖調用。每個繪圖都會使用部分數組進行渲染。

同樣重要的是,對頂點數組而言,問題並不在於綁定緩衝區(雖然它們並不便宜)。它正在改變你使用的vertex format,屬性的相對排列。如果您使用separate attribute format API,則可以輕鬆更改緩衝區綁定而無需觸摸格式。通常,整個程序中只有5-6個頂點格式。

另一個問題是,你還沒有完全探索這裏的可能性數組。例如,在所有情況下,位置,顏色,法線和其他屬性分別位於不同的緩衝區中。那麼......爲什麼他們在單獨的緩衝區? Interleaving your vertex attributes通常會提供更好的性能。

真的,最佳性能的答案是「以上都不是」。

+0

更改頂點格式非常便宜,至少在我熟悉的硬件架構上。這只是一些狀態設置命令。轉換狀態有一點CPU的開銷,但是可以高度優化,特別是如果使用VAO。它肯定比綁定緩衝區少得多。 –

+0

@RetoKoradi:好吧,[NVIDIA和AMD似乎有數據(約32分鐘)](https://www.youtube.com/watch?v=-bCeNzgiJ8I),說頂點格式變化比頂點綁定更昂貴(又名:緩衝區綁定)。所以我會跟他們說什麼。而且,在基於GCN的AMD硬件上,更改頂點格式需要修改頂點着色器,因爲GCN硬件實際上並沒有頂點拉動硬件。 –

1

只有2個對象被渲染,這些選項都不會使你接近任何性能瓶頸。如果您的幀速率與顯示器刷新速率(通常約爲60 fps)相匹配,則您只需要每秒渲染120個對象。假設你需要爲每個對象調用好幾個狀態設置調用,使得你處於每秒1000個狀態設置調用的範圍內。雖然性能特徵當然是高度平臺/供應商特定的,但是一箇中等程度的驅動程序將能夠每秒處理幾百萬個簡單的狀態設置調用(如綁定緩衝區,設置頂點屬性等)。所以你至少要低3或4個數量級,這樣我纔會開始擔心吞吐量。

現在,如果你有成千上萬的對象,事情開始看起來有點不同。有兩件事我肯定會推薦:

  • 使用交錯屬性。這意味着您可以按順序存儲一個頂點的位置和顏色,然後存儲下一個頂點的屬性。說你有用於位置3個部件(xk, yk, pk)和4個分量(rk, gk, bk, ak)頂點k的顏色,所述緩衝器的存儲器佈局是:

    x0 y0 z0 r0 g0 b0 a0 x1 y1 z1 r1 g1 b1 a1 x2 y2 z2 r2 g2 b2 a2 ... 
    
  • 使用VAOs(頂點數組對象)來設置的狀態。這將允許您通過調用單個glBindVertexArray()設置對象的整個頂點屬性狀態。

無論是最好有獨立的維也納組織對每個對象,或者共享對象之間較大的維也納組織,是很難在一般的判斷。擁有大量小型的維也納國際組織可能對性能造成傷害,如果能夠相當容易地安排,分享它們可能是有益的。但是,我也可以想象有非常大的維也納國際組織可能產生不利影響的情況。因此,如果您想要在擁有大量對象的情況下獲得最佳性能,您可能需要嘗試不同的選項。不幸的是,結果很可能取決於平臺。