2013-11-28 26 views
0

我工作的一個可視化引擎(簡單CAD風格)(Python和pyopengl綁定)將顯示,同時動畫高達10-20機構。 我正在使用VBO數據對象來存儲頂點數據並顯示每個正文。我想知道什麼是最好的(最實用,最簡單和更便宜的GPU)方法來爲VBO分配顏色。每個物體都具有統一的顏色,外觀可以設置爲透明 - 可選。正如我知道這可以用下面的方法來完成(I測試方法1和2):增添色彩維也納組織 - 最佳實踐

  1. glColorf(R,G,B,A)
  2. glMaterialfv(GL_FRONT_AND_BACK,[R,G,B ,A])
  3. 指定顏色給每個頂點並創建交錯VBO

是否有任何其他的方法呢?哪一個最適合這項工作? 我也想問一下每個VBO有多少個頂點,以及有多少頂點可以說;小型,中型和大型的維也納國際組織只是爲了讓我更多地瞭解顯示對象的大小。

+1

前兩個已被取消,在OpenGL 3.2+內核不可用。第三種方法是最好的中間方法,但理想情況下,你真正要做的就是使用頂點着色器。你可以做一些事情,比如爲你的VBO中的每一組頂點分配一個索引來標識它們所屬的對象,然後在頂點着色器中通過在統一數組或紋理中查找某些東西來爲每個對象分配顏色。您應該真正考慮每批次繪製的對象數量,而不是每個對象的頂點數量;最後,您通常可以在一次調用中繪製多個對象。 –

+0

@ AndonM.Coleman,如果我創建一個具有5000個頂點(例如,在我的情況下)的VBO,並且必須爲每個頂點添加一個顏色矢量(3或4個成分),並將VBO大小增加2倍或1,25。所有頂點的顏色矢量是否相等,這是否經濟?或者有另一種方法爲VBO添加顏色? 如果我理解正確,這種方法是好的,如果我有FEM結果(每個節點/頂點)顯示它作爲顏色,對不對? – avstenit

回答

1

着色部分取決於你在未來的使用OpenGL的哪個版本的現在,哪個版本,以及你是否想要照明。

如果您使用的是OpenGL 2.1,或許是因爲您喜歡內置矩陣堆棧和gluPerspective,那麼glColor4f是爲非光照對象設置統一顏色的最簡單方法。如果您想使用照明,請添加glColorMaterial調用。或者爲了照明,您可以使用glMaterial。

正如Andon所指出的那樣,如果您不得不移動到OpenGL 3或4,這些將停止工作。因此,如果此程序將在未來進行更新,或者您計劃添加基於可編程GPU着色器的額外功能,獲取OpenGL SuperBible第6版的副本並開始編碼。最簡單的方法是按照您已經發現的方式爲每個頂點顏色添加另一個VBO,或者使用VBO交織顏色。理論上這是浪費空間,因爲單一顏色被重複多次,但如果你沒有改變每一幀的顏色,那又如何? (技嘉顯卡是美妙的。)

OK,每VBO頂點的建議的數量。再次,你在乎嗎?你說你有10-20個對象要渲染。這不是每幀OpenGL調用數量過多。也許如果你需要每幀渲染數以千計的對象,那麼值得思考,但我的建議總是要做最簡單的工作,因爲這通常足夠快。

爲了得到最大的OpenGL性能一般需要儘量減少每幀的呼叫數量。所以如果你有太多的OpenGL調用,數據是一個大的VBO還是很多小的都不重要。在更大的VBO中填充更多數據(在原始重啓時讀取)通常可以減少調用次數,現代顯卡可以讓您每個VBO存儲兆字節甚至千兆字節。閱讀Moller和Haines的實時渲染或SuperBible的間接繪圖部分以獲取更多細節。

希望這會有所幫助。

+0

我正在使用像glTranslate,glRotate,glMultMatrixf,glPushMatrix,glPushMatrix等一些內置的矩陣處理函數,因爲我有並行(正交)投影視圖,我使用它來進行平移/縮放/旋轉。 我也使用VBO來存儲每個物體的頂點數據。據我所知,我可以創建另一個BO來存儲每個頂點的顏色矢量。但是,我只能保存一個顏色矢量,並說這個顏色是分配給每個頂點還是每個頂點必須有新的顏色矢量? – avstenit

+0

關於OpenGL兼容性。我使用Radeon HD6300M(GL版本:4.2.12217兼容性配置文件上下文12.104.0.0),並且全部工作正常。新版本的OpenGL是否也支持所有previus版本的功能?或者我錯過了什麼。感謝您的明確解釋:) – avstenit

+1

要在新式OpenGL 3或4中爲每個頂點使用單一顏色,您必須將其製成統一的顏色。即使VBO中的每個頂點都相同,每個頂點也必須具有相應的顏色值(曲面法線,tex座標,...)。 –