Android / LibGDX上的OpenGL 2中的着色器和变量

时间:2014-04-18 17:27:11

标签: java android opengl-es libgdx glsl

以下代码是我使用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;

1 个答案:

答案 0 :(得分:1)

GLSL ES与传统GLSL的不同之处在于它需要精密修饰符,例如

precision highp float;
void main(){
    //....
{

您的程序在您的计算机上运行正常,因为普通的'GLSL'不需要这些精确修饰符。一旦你跳进GLSL ES,你就会崩溃,因为你没有使用它们。