我认为这将是一个简单的答案 但我用谷歌搜索找不到答案 它是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
应用着色器之前的正常纹理。)
答案 0 :(得分:7)
变量
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_RGBA
或GL_LUMINANCE_ALPHA
,则为实际存储值,或者为1.0。
所以你正确输出alpha。
如果您的输出alpha不具备您期望的混合效果,那么您必须将glBlendFunc
设置为意外的内容,可能涉及GL_CONSTANT_COLOR
。