我有一個巨大的網格(100k三角形),需要繪製幾次並將每個幀混合在一起。是否有可能重用網格第一遍的頂點着色器輸出,並在稍後的過程中跳過頂點階段?我希望能夠節省頂點管線和光柵化的一些成本。稍後可以重用glsl頂點着色器輸出嗎?
目標OpenGL 3.0,可以使用變換反饋等功能。
我有一個巨大的網格(100k三角形),需要繪製幾次並將每個幀混合在一起。是否有可能重用網格第一遍的頂點着色器輸出,並在稍後的過程中跳過頂點階段?我希望能夠節省頂點管線和光柵化的一些成本。稍後可以重用glsl頂點着色器輸出嗎?
目標OpenGL 3.0,可以使用變換反饋等功能。
我會先回答你的基本問題,然後回答你真正的問題。
是的,你可以存儲頂點變換的供以後使用的輸出。這被稱爲變換反饋。它需要OpenGL 3.x級硬件或更好的(又名:DX10-硬件)。
它的工作方式分兩個階段。首先,你必須設置你的程序以獲得基於反饋的變化。你用glTransformFeedbackVaryings
來做到這一點。在連接程序之前必須完成,類似於glBindAttribLocation
之類的操作。
一旦完成,你需要綁定緩衝區(給定你如何設置變換反饋的變化)到GL_TRANSFORM_FEEDBACK_BUFFER
與glBindBufferRange
,從而設置將數據寫入哪些緩衝區。然後,您使用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。而且由於陰影貼圖需要不同的變換,無論如何你都不會從反饋中獲得任何東西。
100k不是我會說的一個數字。提及您計劃應用程序的硬件/ gpu。 – Abhinav
針對現代消費電腦。我有測試卡,包括nvidia GTS450,GT570,GT650M和一些相當的ati卡。 – shenbo
這是一個地形系統,100k是一個補丁。我試圖控制每幀畫出的三角形總數達到100萬左右。目前地形系統消耗大約700k。他們大多數是補丁(最高檢測限) – shenbo