Opengl Shader,什么是gl_FragColor的alpha组件?

Jin*_*Heo 8 shader opengl-es glsl cocos2d-x

我认为这将是一个简单的答案.
但我用谷歌搜索找不到答案.
它是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;

}
Run Code Online (Sandbox Code Playgroud)

我只想在某个圆圈区域给出不透明度.所以我改变颜色的w值,因为我认为它是纹素的alpha值.但结果很奇怪.我担心这不是alpha值.

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


它的顶点着色器非常正常,没有什么特别的附加.


请问任何想法.



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

情况1)

col.w = alpha;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

案例2)

col.w = 1.0
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


应用着色器之前的正常纹理.)

在此输入图像描述

Tom*_*mmy 7

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是输出alpha gl_FragColor.

要回答您设置为标题而不是正文中的问题的问题,返回的值texture2D将是该纹理的正确值.任一的实际存储的值,如果所述纹理是GL_RGBAGL_LUMINANCE_ALPHA要不然1.0.

所以你正确输出alpha.

如果您的输出alpha没有您期望的混合效果,那么您必须glBlendFunc设置为意外的,可能涉及GL_CONSTANT_COLOR.