2012-10-16 81 views
3

我有一個巨大的網格(100k三角形),需要繪製幾次並將每個幀混合在一起。是否有可能重用網格第一遍的頂點着色器輸出,並在稍後的過程中跳過頂點階段?我希望能夠節省頂點管線和光柵化的一些成本。稍後可以重用glsl頂點着色器輸出嗎?

目標OpenGL 3.0,可以使用變換反饋等功能。

+0

100k不是我會說的一個數字。提及您計劃應用程序的硬件/ gpu。 – Abhinav

+0

針對現代消費電腦。我有測試卡,包括nvidia GTS450,GT570,GT650M和一些相當的ati卡。 – shenbo

+0

這是一個地形系統,​​100k是一個補丁。我試圖控制每幀畫出的三角形總數達到100萬左右。目前地形系統消耗大約700k。他們大多數是補丁(最高檢測限) – shenbo

回答

4

我會先回答你的基本問題,然後回答你真正的問題。

是的,你可以存儲頂點變換的供以後使用的輸出。這被稱爲變換反饋。它需要OpenGL 3.x級硬件或更好的(又名:DX10-硬件)。

它的工作方式分兩個階段。首先,你必須設置你的程序以獲得基於反饋的變化。你用glTransformFeedbackVaryings來做到這一點。在連接程序之前必須完成,類似於glBindAttribLocation之類的操作。

一旦完成,你需要綁定緩衝區(給定你如何設置變換反饋的變化)到GL_TRANSFORM_FEEDBACK_BUFFERglBindBufferRange,從而設置將數據寫入哪些緩衝區。然後,您使用glBeginTransformFeedback開始您的反饋操作,並照常進行。您可以使用primitive query object獲得書面(這樣就可以用glDrawArrays後繪製)元的數目,或者如果你有4.x的一流的硬件(或AMD 3.X的硬件,所有這些都支持ARB_transform_feedback2),你可以render without querying the number of primitives。這會節省時間。

現在爲您的實際問題:它可能不會幫助您購買任何真正的表現。

您正在繪製地形。地形並沒有真正發生轉變。通常情況下,你有一個或兩個矩陣乘法,可能與法線(但如果你正在渲染陰影地圖,你甚至沒有)。而已。

賠率是非常好的,如果你推100000個頂點向下GPU這樣一個簡單的着色器,你可能已經飽和了GPU的渲染他們所有的能力。你可能會在原始的裝配/設置上遇到瓶頸,而且速度不會更快。

所以,你可能不會得到太多出這一點。反饋通常被用於任一生成三角形數據以供以後使用(有效僞計算着色),或用於從複雜變換像具有雙四元數等矩陣調色板蒙皮保存的結果。簡單的矩陣乘法運算幾乎不會成爲雷達上的一個小問題。

如果你喜歡,你可以試試。但賠率是你不會有任何問題。一般來說,最好的解決方案是使用某種形式的延遲渲染,因此只需爲其投射的每個陰影(其中X由陰影映射算法確定)渲染一次對象一次+ X。而且由於陰影貼圖需要不同的變換,無論如何你都不會從反饋中獲得任何東西。

+0

感謝您的快速回復。我在我的引擎中實現了變換反饋。 'glDrawArrays'是否仍然通過頂點管道推送所有數據?也許我應該把我的問題改爲「重用光柵化結果」〜 – shenbo

+0

@shenbo:是的。它被稱爲「延遲渲染」。 –

+0

我已經在照明計算中使用延遲方法。只是想知道是否有任何方法完全跳過頂點着色器階段。似乎目前還不可能。接受答案。 – shenbo