2015-09-19 29 views
0

我不確定我的問題是否足夠清楚,所以在這裏解釋: 我正在使用opengl處理體素引擎,它工作正常,但我想通過一些優化改進它。我開始使用VBO作爲立方體的頂點,我賺取了一些fps,這非常棒。但現在我想要做同樣的thiong與立方體的顏色和我沒有找到我所喜悅的答案,因爲我有需要的細節:有沒有辦法在Opengl中使用vbo而不是統一的輸入值?

  • 我只用3浮動的顏色,因此,即使如果它的工作原理glVertexAttribPointer()不似乎是去,因爲如果我使用它,我將需要使用108浮法每立方反對3.

  • 我想吸引很多的立方體所以使用glUniform3f ISN的好方法這並不是好事,因爲每立方體發送3個浮標的速度非常慢,需要很多立方體來繪製。

因此,與上下文我的問題是,是否有保存價值的GPU的內存(如VBO),當我畫立方體我只想告訴那些人在那裏值着色器的方式?

感謝您的閱讀,並且可以回答:)

+0

你可以例如按顏色對立方體進行排序,然後使用制服進行顏色/紋理。 – dari

+0

首先,一個顏色應該是3個字節,而不是3個浮點數,這爲您節省了75%。您可以對它們進行排序,但也可以在顏色表中進行查找,這樣可以將數據減少爲不同顏色的數量。例如,如果只指定256種顏色,則只能爲每個頂點分配一個顏色,但只有1個字節,比顏色本身少3倍。您還可以使用實例化渲染來繪製立方體,然後爲每個實例提供一種顏色,或者更好地爲每個實例提供一種顏色的索引。這些都是可能的選擇,問題是:你知道多少OpenGL?顏色是否改變了? –

+0

按顏色排列立方體是一個好主意,我沒有考慮它,所以謝謝:)。 – Rahotop

回答

0
glVertexAttribDivisor(attribute, 1) 

告訴#attribute具有每原始的一種價值,而不是每個頂點的OpenGL。如果將數字從1增加到N,則每N個基元可以有1個值。用於指定顏色(或其他)一次而不是重複。

另外glDrawArraysInstanced/glDrawElementsInstanced可能會有用。這兩種畫一組點/線/三角形N次,並在你的着色器,你可以使用gl_InstanceID作爲一個整數,將計算立方/任何#0,#1,...

希望這有助於

+0

如果我理解得很好,這可能是最好的選擇。我只是不確定我必須如何使用它,我的意思是屬性是什麼?和其他opengl函數一樣,我認爲我必須綁定一個對象,但是哪一個?與哪個glBind? – Rahotop

+0

好的,如果你不明白什麼是屬性,給自己買一本OpenGL SuperBible,然後開始閱讀!如果你不瞭解底層系統的工作原理,試圖優化任何程序是毫無意義的 –

+0

我閱讀了關於Opengl 3的教程。3但它確實不完整我的意思是作者解釋瞭如何從Opengl開始,但僅此而已。所以即使只有基礎知識,我知道一個屬性是一個Opengl objet的索引,我不明白的是我必須在這裏發送他的索引的對象是什麼?當然,我會說,我必須發送顏色的vbo的索引,但我不確定,那對嗎? – Rahotop

相關問題