自定义着色器无法在Android设备上运行(使用LibGDX)

时间:2013-04-02 21:32:19

标签: android compilation glsl shader libgdx

我一直在开始使用LibGDX开发PC和Android。我目前正在开展一个小项目,要求我在GLSL中编写自定义着色器(基于全屏四边形)。来自HLSL环境我在设置整个着色器系统与SpriteBatch时遇到了一些麻烦(因为我希望尽可能简化代码)。

我在桌面上有以下着色器代码:

Vertexshader:

attribute vec4 a_position;
uniform mat4 u_projectionViewMatrix;
void main()
{
    gl_Position = a_position * u_projectionViewMatrix;
}

Fragmentshader:

uniform vec2 effectOrigin;
uniform vec2 effectDir;
void main()
{
    float distToOrigin = distance(effectOrigin.xy, gl_FragCoord.xy);
    gl_FragColor = vec4(mod(distToOrigin+effectDir.x*30, 30)-15, 0.0, 0.0, 1.0);
}

正如我所说它适用于桌面(Windows),并给我一个漂亮的圆形图案。在Android上然而它不编译并且只给我清除的背景颜色。我怀疑它与Android上的OpenGL ES 2权限有关,所以我将这行添加到清单中: <uses-feature android:glEsVersion="0x00020000" android:required="true" />,但这似乎没有什么区别。

我还认为它可能与浮点数和向量的精度有关,但我无法弄清楚如何更改它们以便修复它。

有人可以帮我这个吗?我无法在其他地方找到答案!

提前致谢,

由里

P.S。有没有办法在编译着色器时看到出了什么问题?我知道着色器上的调试很难,但至少要知道在编译过程中它可能出错的地方真是太棒了。

1 个答案:

答案 0 :(得分:2)

使用P.T。建议记录编译时修复它! 片段着色器中存在两个问题,固定着色器看起来像这样:

precision mediump float;
uniform vec2 effectOrigin;
uniform vec2 effectDir;
void main()
{
    float distToOrigin = distance(effectOrigin.xy, gl_FragCoord.xy);
    gl_FragColor = vec4(mod(distToOrigin+effectDir.x*30.0, 30.0)-15.0, 0.0, 0.0, 1.0);
}

我在顶部添加了精度定义,并且还将常量值从整数更改为浮点数(例如15到15.0)来修复它!

谢谢P.T。!