OpenGLES 2.0 片段着色器 alpha 失败?

3

如果使用下面的片段着色器,我期望我的纹理完全消失:

varying mediump vec2 text_coord_out;
uniform sampler2D sampler;

void main()
{
    gl_FragColor = texture2D(sampler, text_coord_out);
    gl_FragColor.w *= 0.0;
}

我尝试过使用gl_FragColor.a,但是它没有起作用。有什么想法吗?

4个回答

9

天啊...我彻底解决了这个问题。片段着色器应该是这样的:

varying mediump float text_alpha_out;
varying mediump vec2 text_coord_out;
uniform sampler2D sampler;

void main()
{
    gl_FragColor = texture2D(sampler, text_coord_out);
    gl_FragColor = gl_FragColor * text_alpha_out;
}

我的混合效果如下:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

每个着色器程序只能调用一次“gl_fragColor =”。第二次调用将被忽略。 - George
4
你能否多次调用gl_fragColor?第二次调用不会被忽略。我经常这样做。 - badweasel

7

仅使用gl_fragColor =一次

  1. 在此情况下,像另一个vec4一样对不同变量执行所有操作
  2. 您可以将其用作输出,例如:

vec4 red = vec4( 1,0,0,1 );
gl_fragColor = red;

我怀疑这个。在我的实验中,对gl_FragColor的第二次调用没有被忽略。 - Ming

4
为什么它应该消失?输出颜色的 alpha 值没有意义,除非你赋予它一定的意义。通常,这意味着使用某种形式的混合blending。请注意,该链接描述的是桌面 OpenGL;GL ES 的等效方式基本相同,但桌面 GL 可能具有比 ES 更多的功能。

谢谢。这让我更接近了解。我已经从' glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); '转到:' glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ZERO); '但是重新引入了: http://stackoverflow.com/questions/6060578/iphone-opengles-2-0-text-texture-w-strange-border-not-stroke-issue - jbg
问题似乎是我有带预乘alpha的纹理...这与GL_SRC_ALPHA作为混合函数的第一个参数不兼容...但如果我使用GL_ONE,那么着色器中就不会发生混合...你有什么想法吗? - jbg
@datafatmunger:混合不应该在着色器中发生。所以我不确定你的问题是什么。 - Nicol Bolas

0
gl_FragColor.w = 0;

应该可以工作。可能 *= 操作会让 GLSL 编译器感到困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接