WebGL:纹理中的零alpha像素是否必然会更新深度缓冲区?

时间:2012-09-08 23:24:47

标签: webgl fragment-shader alpha-transparency

我正在尝试渲染一个混合了全透明像素和完全不透明像素的纹理。看起来我唯一的选择就是将它们从后向前渲染(在所有完全不透明的多边形之后),因为即使是完全透明的像素也会更新深度缓冲区,但我不确定它是否准确。是吗?

似乎片段着色器可以被告知单独留下深度缓冲区用于透明像素,但显然不是。我错过了什么吗?

除了我想不到的许多多边形之外,还有其他一些合理的方法来渲染高度不规则形状的图像吗?

2 个答案:

答案 0 :(得分:9)

既然我已经提出了这个问题,我似乎至少找到了一个答案。片段着色器中的discard语句似乎可以满足我的需求:

void main(void) {
  vec4 textureColor = texture2D(uSampler, vTextureCoord);
  if (textureColor.a < 0.5) 
    discard;
  else
    gl_FragColor = vec4(textureColor.rgb * vLighting, textureColor.a);
}

答案 1 :(得分:0)

当你到达片段着色器时,已经确定会有一个像素,无论你是否输出alpha。避免它的唯一方法是使用像glEnable(GL_ALPHA_TEST)这样的选项。但是,这仅适用于0或1的alpha值,就像绘制带有硬边框的精灵一样。如果你想要软边框或者你想要半透明物体,你需要画回到前面。你可能需要为此切割几何。