2014-05-12 131 views
2

作爲標題,gl_FragColor.a = 0應該使事物透明。那麼丟棄的差異是什麼?在OpenGL Fragment Shader中,gl_FragColor.a = 0和discard有什麼區別?

對於以下代碼

varying vec3 f_color; 
uniform sampler2D mytexture; 
varying vec2 texCoords; 
float cutoff = 0.5; 

void main(void) { 
    gl_FragColor = texture2D(mytexture,texCoords); 
    if(gl_FragColor.a < cutoff) discard; 
} 

丟棄將工作,但如果我gl_FragColor.a = 0替換丟棄; ,它沒有效果。爲什麼?

回答

6

首先,如果啓用混合,首先,alpha到零隻會隱藏像素。放棄將防止片段被完全寫入。例如,如果你寫了一個alpha零的片段,即使你沒有改變像素的顏色,它仍然會更新深度緩衝區和模板緩衝區。丟棄它不會影響其中任何一個。

對於一個完整的例子,假設我使用一個四邊形渲染一個樹形分支,並使用alpha測試。通過丟棄透明的片段,我可以稍後渲染該分支後面的東西,因爲深度緩衝區不會將這些片段放在中間。如果您只將alpha設置爲零,深度緩衝區將保留完整的四邊形,之後渲染的任何東西都將被整個四邊形遮擋,而不是通過丟棄測試的葉子。

相關問題