2013-05-21 30 views
1

在我的項目中,我使用「放棄」調用來執行自定義模板測試,該測試試圖僅在由模具紋理定義的指定區域繪製事物。下面是從片段着色器代碼:如何在片段着色器中進行自定義的模板測試

//get the stencil value from a texture 
float value=texture2D(stencilTexture, gl_FragCoord.xy/1024.0).x; 
//check if value equals the desired value, if not draw nothing 
if(abs(value-desiredValue)>0.1) 
{ 
    discard; 
} 

此代碼的工作,但是從性能問題的困擾,因爲「取消」呼叫。有沒有其他方法可以通過GPU着色器來做到這一點?告訴我如何。

+0

爲什麼你不能使用默認的模板測試(不在着色器中)?你會得到相同的結果。 – fen

+0

「* alliterative *」我認爲你的意思是「另類」。此外,目前尚不清楚爲什麼您需要使用* stencil *紋理來執行此操作。或者爲什麼你認爲'discard'調用是一個性能問題(或者如果是性能問題,那麼問題比紋理訪問本身更糟糕)。 –

+0

@NicolBolas:抱歉我的拼寫錯誤,在我的實驗中,我發現丟棄電話是一個性能問題,這也是[鏈接]報告(http://stackoverflow.com/questions/8509051/is-discard-bad-for -program-performance-in-opengl) – Sunf71

回答

2

如果您訪問紋理,您必須承受與訪問紋理相關的性能損失。同樣,如果你想停止渲染片段,你必須承受與停止渲染片段相關的性能損失。

無論如何停止該片段,這將是真實的。無論是真正的模板測試,基於着色器的discard還是alpha測試,所有這些都將遇到相同的一般性能問題(對於硬件,其中discard導致任何重大性能問題,主要是移動硬件)。唯一的例外是深度測試,這是因爲why certain hardware has problems with discard

對於其中discard對性能有實質性影響的平臺,如果硬件可以假定深度是是否渲染片段的最終仲裁者(並且因此具有最高/最低深度總是勝利)。因此,除了深度測試以外,任何剔除片段的方法都會干擾此優化。

+0

感謝您的回覆!非常合理的答案! – Sunf71

相關問題