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

WebGL:纹理中的零alpha像素是否一定会更新深度缓冲区?,webgl,fragment-shader,alpha-transparency,Webgl,Fragment Shader,Alpha Transparency,我试图渲染一个纹理,它包含完全透明的像素和完全不透明的像素。看起来我唯一的选择是从远到近(毕竟是完全不透明的多边形)渲染它们,因为即使是完全透明的像素也会更新深度缓冲区,但我不确定这是否准确。是吗 似乎可以告诉片段着色器对透明像素不使用深度缓冲区,但显然不行。我遗漏了什么吗 除了我没有想到的许多多边形之外,还有其他合理的方法来渲染高度不规则形状的图像吗?当您到达片段着色器时,无论是否输出alpha,都已经确定将有一个像素。避免这种情况的唯一方法是使用glEnable(GL_ALPHA_测试)等选

我试图渲染一个纹理,它包含完全透明的像素和完全不透明的像素。看起来我唯一的选择是从远到近(毕竟是完全不透明的多边形)渲染它们,因为即使是完全透明的像素也会更新深度缓冲区,但我不确定这是否准确。是吗

似乎可以告诉片段着色器对透明像素不使用深度缓冲区,但显然不行。我遗漏了什么吗


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

当您到达片段着色器时,无论是否输出alpha,都已经确定将有一个像素。避免这种情况的唯一方法是使用glEnable(GL_ALPHA_测试)等选项。但是,这仅适用于alpha值为0或1的情况,例如绘制具有硬边框的精灵时。如果需要软边框或半透明对象,则需要将其向后拉到前面。你可能需要为此切割几何体。

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

void main(void) {
  vec4 textureColor = texture2D(uSampler, vTextureCoord);
  if (textureColor.a < 0.5) 
    discard;
  else
    gl_FragColor = vec4(textureColor.rgb * vLighting, textureColor.a);
}
void主管道(void){
vec4 textureColor=texture2D(uSampler,vTextureCoord);
if(纹理颜色a<0.5)
丢弃;
其他的
gl_FragColor=vec4(textureColor.rgb*vLighting,textureColor.a);
}

我确实有硬边界。然而,WelGL显然不支持此功能。Quoth Chrome:
WebGL:INVALID_ENUM:enable:INVALID capability
Yes,这是正确的解决方案。在固定函数OpenGL中,这被称为alpha测试。顺便说一下,如果vTextureCoord是一个
vec2
,那么您的
vec2()
是多余的,如果不是,那么
vTextureCoord.st
就足够了。谢谢,凯文!很高兴知道我在正确的轨道上。(我也扔掉了你提到的那种意大利面垃圾,再次感谢。)哦,那真是太棒了。非常感谢你。