以下代码是我使用default LibGDX SpriteBatch shader创建的片段着色器,只是修改为加扰RGB通道,它在Android和PC上都可以正常工作:
#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif
varying LOWP vec4 v_color;
varying vec2 v_texCoord;
uniform sampler2D u_texture;
void main()
{
gl_FragColor = v_color * texture2D(u_texture, v_texCoord);
gl_FragColor.rgb = vec3(gl_FragColor.g, gl_FragColor.r, gl_FragColor.b)
}
然而,当我尝试将任何变量添加到着色器程序时(我排除#ifdef ... u_texture;但它仍然在着色器中):
float test;
void main()
{
gl_FragColor = v_color * texture2D(u_texture, v_texCoord);
test = (gl_FragColor.r + gl_FragColor.g + gl_FragColor.b) / 3.0f;
gl_FragColor.rgb = vec3(test, test, test);
}
它可以在PC上运行,但是android上的崩溃 - shader在android上编译也很好,但是当调用SpriteBatch ApplyShader方法时,app崩溃了(根据logcat)。
尝试内联定义变量,如下所示:
float test = (gl_FragColor.r + gl_FragColor.g + gl_FragColor.b) / 3.0f;
但它并没有改变一件事 - 在PC上仍能完美运行,但在Android上却无法运行。此外,即使我写了类似的内容,它也会崩溃:
test = 0.4f;
答案 0 :(得分:1)
GLSL ES与传统GLSL的不同之处在于它需要精密修饰符,例如
precision highp float;
void main(){
//....
{
您的程序在您的计算机上运行正常,因为普通的'GLSL'不需要这些精确修饰符。一旦你跳进GLSL ES,你就会崩溃,因为你没有使用它们。