2013-02-08 104 views
2

在默認的網格頂點構造中,我們執行此操作。OpenGL頂點屬性重用

//v = vertex, p = position, c = color 
buffer = { v0 , p0, c0, 
      v1 , p0, c0, 
      v2 , p0, c0 }; 

而且我們有一個三角形。 但我想重用明顯的特徵是這樣的:

//p and c are the same for all vertexes 
buffer = { v0, p0, c0 , 
      v1, 
      v2 }; 

我們可以在着色均勻值做到這一點,但我會渲染數以千計的同一緩衝區不同位置的三角形:

buffer = { v0, p0, c0 , 
      v1, 
      v2, 
      v3, p1, c1, 
      v4, 
      v5, 
      v6, p2, c2, 
      ...}; 

我現在的解決方案是:

1)發送屬性的副本像第一個例子中的每個頂點(鴕鳥政策想,但也許是最好的解決方案)。

2)發送用於位置/顏色(統一大小限制問題的索引屬性(搜索)和均勻陣列?)

3)最佳解決方案?

+0

這樣做(很小)的內存利益的性能損失通常是不值得的,沒有乾淨的方式做到這一點。在加載大多數模型的情況下,您將擁有大多數獨特的紋理座標和法線。 –

+0

對我來說,這看起來像是虛假的經濟。在擔心一些「冗餘」數據之前,我更擔心GPU的效率。與紋理內存要求相比,這沒什麼。 –

+0

除了(或者儘管有!)我之前說過的,你可能會發現[provoking vertex](http://www.opengl.org/wiki/Primitive#Provoking_vertex)有一些用處。 –

回答

3
//p and c are the same for all vertexes 

不,他們不是。在你的情況下,頂點是v,p和c的整個組合。改變其中的一個,並且你有一個完全不同的頂點。常見的誤解,但這就是它的工作原理

+0

您是對的,我的意思是'相同的值'。 – Patric

2

假設你不是在一個古老的硬件上,並且頂點內存不是真的那麼重要,只需複製數據並保留每個頂點具有一組完整的屬性。它肯定不會變慢。

以這種方式「重用」數據通常會導致性能下降,因爲GPU無法優化數據訪問;它必須做你想要做的複雜事情。

+3

請問下降者請說明原因? –