以下代码是我使用 default LibGDX SpriteBatch shader 创建的 fragment 着色器简单地修改为加扰 RGB channel ,它在 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 上崩溃 - 着色器在 android 上编译也很好,但是当调用 SpriteBatch ApplyShader 方法时应用程序崩溃(根据 logcat)。
尝试像这样定义内联变量:
float test = (gl_FragColor.r + gl_FragColor.g + gl_FragColor.b) / 3.0f;
但这并没有改变什么——在 PC 上仍然可以正常工作,但在 Android 上却不行。此外,即使我写了类似的东西它也会崩溃:
test = 0.4f;
最佳答案
GLSL ES 与传统 GLSL 的不同之处在于它需要精度修饰符,例如
precision highp float;
void main(){
//....
{
您的程序在您的计算机上运行良好,因为普通的 GLSL 不需要这些精度修饰符。一旦你跳入 GLSL ES,你就会崩溃,因为你没有使用它们。
关于java - Android/LibGDX 上 OpenGL 2 中的着色器和变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23159031/