new*_*cpp 3 opengl fragment-shader
标题为,gl_FragColor.a = 0应该使事物透明.丢弃的差异是什么?
对于以下代码
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;
}
Run Code Online (Sandbox Code Playgroud)
丢弃将工作,但如果我用gl_FragColor.a = 0替换丢弃; ,它没有效果.为什么?
首先,如果启用了混合,alpha到零将仅隐藏像素.丢弃将阻止片段完全写入.例如,如果您编写一个alpha零的片段,即使您没有更改像素的颜色,它仍会更新深度缓冲区和模板缓冲区.丢弃它不会影响其中任何一个.
举一个完整的例子,假设我用一个四边形渲染一个树枝,并在你做的时候使用alpha测试.通过丢弃透明的片段,我可以稍后在该分支后面渲染一些东西,因为深度缓冲区不会丢弃这些片段.如果你只是将alpha设置为零,深度缓冲区将保持完整四边形,之后渲染的任何内容都会被整个四边形遮挡,而不是通过丢弃测试的叶子.