Opengl着色器,gl_FragColor的alpha分量是什么?

10

我认为这会是一个比较简单的答案。
但是我在谷歌上找不到答案。
这与OpenGLES着色器有关。我正在使用cocos2d-x引擎。

这是我的片段着色器代码。

precision lowp float;
varying vec2 v_texCoord;
uniform sampler2D u_texture;
uniform vec4 u_lightPosition;

void main()
{
    vec4 col=texture2D(u_texture,v_texCoord);

    mediump float lightDistance = distance(gl_FragCoord, u_lightPosition);
    mediump float alpha = 100.0/lightDistance;
    alpha = min(alpha, 1.0);
    alpha = max(alpha, 0.0);
    col.w = alpha;
    //col.a = alpha;


    gl_FragColor=col;

}

我只想让某些圆形区域显示为半透明。所以我改变了颜色的w值,因为我认为这是像素的Alpha值。但结果非常奇怪,我担心这不是Alpha值。

即使我将值设置为1.0进行测试,整个精灵也会变得明亮和白色。

顶点着色器很正常,没有特殊的内容。

请问有任何想法吗?

更新: 为了参考,我附上一些结果图像。

情况1)

col.w = alpha;

在此输入图片描述

第2种情况)

col.w = 1.0

输入图像描述


应用着色器之前的输入图像和正常纹理。

输入图像描述


因此,你是正确的,gl_FragColor的w。 :) - Jinbom Heo
1
我放置了结果样本。 :) - Jinbom Heo
4
你的混合模式是什么? - Tommy
2
正如Tommy所说,您应该将当前的混合模式添加到问题中。另外,您可以使用clamp替换您的min/max行,像这样:clamp(alpha, 0.0, 1.0) - nwn
谢谢Tommy。我再次检查了混合模式,它是GL_ONE,GL_ONE_MINUS_SRC_ALPHA。我认为这就是亮度增加的原因。 - Jinbom Heo
显示剩余2条评论
1个回答

10

GL ES 2.0参考手册定义了:

变量
mediump vec4 gl_FragColor;

描述
片段颜色

单位或坐标系统
RGBA颜色

它进一步说明:

向量分量
除了数组数字下标语法外,向量分量的名称由单个字母表示。分量可以被重组和复制,例如:pos.xx,pos.zy

{x,y,z,w}用于访问表示点或法线的向量

{r,g,b,a}用于访问表示颜色的向量

{s,t,p,q}用于访问表示纹理坐标的向量

因此,使用 .a 是更符合惯例的,但显式地指定将值存储到 .w 是为了输出 gl_FragColor 的 alpha 值。

回答您在标题中设置的问题而非正文中的问题,则 texture2D 返回的值将是该纹理的正确值。如果纹理是 GL_RGBAGL_LUMINANCE_ALPHA,则返回实际存储的值;否则返回 1.0。

因此,您已经正确地输出 alpha 值。

如果您的 alpha 值没有产生您期望的混合效果,则您必须将 glBlendFunc 设置为意外的值,可能涉及 GL_CONSTANT_COLOR


谢谢。现在它运行良好。 vec4 col = texture2D(u_texture, v_texCoord); mediump float lightDistance = distance(gl_FragCoord, u_lightPosition); mediump float alpha = 100.0 / lightDistance; alpha = clamp(alpha, 0.0, 1.0); gl_FragColor.a = 1.0 - alpha; - Jinbom Heo

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