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

标签 java android opengl-es libgdx glsl

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

相关文章:

android - 如何使用 glReadPixels 从前台缓冲区读取?

java - 当处理器依赖于注释值中的类时,选择 Gradle 增量注释处理器类别

android - 如何从实时相机预览中检测平均像素强度?

android - 在Android Studio中,如何使用GridView显示一个矩阵的Text Boxes?

java - 如何遍历 MethodCall 对象以获取参数

ios - GLKTextureLoader 未在 "The new iPad"上加载 jpg

java - OpenGL ES 中的旋转

java - if 或语句 xml 和 java 控制台输出

java - 是否可以拉出单元测试运行面板?

java - 使用 javac 的错误类文件