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

时间:2014-07-01 02:15:57

标签: opengl-es glsl shader 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;

}

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

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


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


请知道。



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

案例1)

col.w = alpha;

enter image description here

案例2)

col.w = 1.0

enter image description here


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

enter image description here

1 个答案:

答案 0 :(得分:7)

GL ES 2.0 reference card定义:

  

变量
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