【问题标题】:Custom Shader not working on Android Device (using LibGDX)自定义着色器不适用于 Android 设备(使用 LibGDX)
【发布时间】:2013-04-07 20:43:22
【问题描述】:

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

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

顶点着色器:

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

片段着色器:

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" />,但这似乎没有什么不同。

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

有没有人可以帮助我解决这个问题?我无法在其他地方找到答案!

提前致谢,

尤里

附:有没有办法查看在着色器编译过程中出了什么问题?我知道在着色器上调试很困难,但是至少知道编译过程中哪里可能出错了。

【问题讨论】:

  • 您可以通过x = new ShaderProgram(...); if (!x.isCompiled()) { Gdx.app.log("Shader", x.getLog()); } 在 Libgdx 中获取着色器编译器日志。您是否还在您的应用配置中启用了useGL20
  • 感谢着色器日志!打算试一试。如果您的意思是在cfg.useGL20 = true; 中启用 useGL20,那么可以。
  • 如果你能用你遇到的实际问题来回答你自己的问题,那就太好了(我假设如果着色器在桌面而不是 Android 上工作,会有一些有趣的事情发生.. .)
  • 我做了,我在原来的问题中回答了,最后;)!
  • 这对于将 GLSL 移植到 Android 的其他人来说非常方便。但是,您的答案可能应该出现在下面的“答案”框中。请阅读stackoverflow.com/faq#howtoask

标签: android compilation glsl shader libgdx


【解决方案1】:

使用 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.!

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多