为什么我的简单片段着色器不适用于iOS,而不适用于Cocos2d-x 3.2下的Android?

时间:2014-08-04 08:34:21

标签: android opengl-es-2.0 cocos2d-x shader cocos2d-x-3.0

我修改了一个工作的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);
}

2 个答案:

答案 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才能以相同的方式运行?