我修改了一个工作的grey_scale片段着色器,将所有非透明像素更改为紫色。出于某种原因,它在iOS上运行良好,但在Android上,图像的透明部分是可见的(尽管大多数是透明的)。谁能看到我做错了什么?
工作的grey_scale着色器包含已注释掉的行。我添加了最后一行。
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main(void)
{
vec4 c = texture2D(CC_Texture0, v_texCoord);
//gl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);
//gl_FragColor.w = c.w;
gl_FragColor = vec4(0.5, 0.0, 0.4, c.w);
}
答案 0 :(得分:0)
屏幕截图价值数千字。
您确定GL_ES
已定义吗?如果没有,您将具有float
的未指定精度(根据规范,未指定片段着色器),这甚至可能导致某些OpenGL ES驱动程序上的编译错误。我首先要使用浮动精度,然后在Android上看到差异。
我不确定vec3()
w /单个参数。以下符号是否有效:
float a = 0.2126*c.r + 0.7152*c.g + 0.0722*c.b;
gl_FragColor.xyz = vec3(a, a, a);
或者这个,只需要一个gl_FragColor:
float a = 0.2126*c.r + 0.7152*c.g + 0.0722*c.b;
gl_FragColor.xyz = vec4(a, a, a, c.w);
另外,您可能希望将数字文字声明为常量,以便不占用统一空间。更多信息:Declaring constants instead of literals in vertex shader. Standard practice, or needless rigor?
像这样:
const float COEFF_R = 0.2126;
const float COEFF_G = 0.7152;
const float COEFF_B = 0.0722;
float a = COEFF_R*c.r + COEFF_G*c.g + COEFF_B*c.b;
gl_FragColor.xyz = vec4(a, a, a, c.w);
答案 1 :(得分:0)
事实证明我需要将alpha应用于所有颜色:
gl_FragColor = vec4(0.5*c.w, 0.0*c.w, 0.4*c.w, c.w);
我确信为什么旧方法不起作用。图像使用预乘alpha,所以我猜cocos渲染假设它(或者某种方式告诉它使用TexturePacker)。因此,着色器需要将颜色值重新乘以alpha才能以相同的方式运行?