2011-03-23 67 views
1

我具有覆蓋上用模版和α緩衝器清零視口-0.5,0.5和0.5,-0.5之間的區域中的四邊形。在片段着色器中,我應用了一個恰好具有形狀的紋理 - 在這種情況下是一個圓形 - 其外部完全透明。基於OpenGL ES 2.0和Alpha /模板提問測試

我想弄清楚如何從形狀的下一個繪製中基本上「剪去」非alpha紋理形狀,這樣我就可以繪製第一個四邊形,在某種程度上(如-0.3, 0.5和0.8,-0.5)並且再次繪製,並且僅繪製第二四邊形紋理的非alpha紋理的非重疊。

這是很容易的做這個用模板緩存,使得它適用於四是盲目的紋理,但是我想將它應用到紋理。

所以當我想要什麼實際呈現的概念圓的紋理會在這種情況下月牙功能的一個例子。我不知道我應該使用什麼測試。

回答

4

我想你想堅持使用模板緩存,但alpha測試不提供ES 2.0%是任何可以在着色器做的工作也不是固定的功能提供的理念。

相反,你可以插入片段着色器內自己選擇一個,這要歸功於discard關鍵字。假設你有最瑣碎的紋理片段着色器:

varying mediump vec2 texCoordVarying; 
uniform sampler2D tex2D; 

void main() 
{ 
    gl_FragColor = texture2D(tex2D, texCoordVarying); 
} 

你可以在alpha測試拋出讓小於0.1的alpha像素不繼續向下的管道,因此不影響模板緩衝帶:

varying mediump vec2 texCoordVarying; 
uniform sampler2D tex2D; 

void main() 
{ 
    vec4 colour = texture2D(tex2D, texCoordVarying); 

    if(colour.a > 0.1) 
     gl_FragColor = colour; 
    else 
     discard; 
} 
+1

我意識到這是一個老帖子,但我只是想補充一點,這是許多GPU的可怕的形式,因爲這將運行遠比顏色只設置爲0。例如慢,丟棄和在某種程度上,分支在iOS ES 2.0 SL – David 2014-09-28 12:57:47

+0

上被認爲是一個壞主意。如果您的混合模式允許的話,你可以用深度緩衝寫入住那麼它是不是'discard'更快地輸出像素爲0的阿爾法。用一個減法,一個鉗位和一個加法,比用一個明確的條件還要快得多。在這兩種情況下,GPU都必須處理條件,這意味着較低的並行性。 – Tommy 2014-09-28 19:41:55