java - 自定义着色器导致 Android 黑屏

标签 java android opengl-es-2.0 libgdx shader

我正在尝试为 libgdx 项目使用自定义着色器以在 Android 上运行。我还没有弄清楚如何进行 USB 调试,所以在真正的 Android 设备上运行时我似乎无法获得任何日志。

问题是实现我编写的着色器会导致我的 Samsung Galaxy Nexus 出现黑屏。它在桌面项目和在 Eclipse 中的 Android 模拟器上运行的 Android 项目中产生正确的结果。未实现着色器使其也可以在我的 Android 上正确呈现(尽管没有着色器效果)。

所以我提出这个问题希望其他人可以发现任何问题。最好的问候。

着色器设置(在 Java 中):

ShaderProgram.pedantic = false;
shader = new ShaderProgram(
    Gdx.files.internal("shaders/vignette.vsh"),
    Gdx.files.internal("shaders/vignette.fsh"));

if (! shader.isCompiled()) {
    Gdx.app.log("Shader", shader.getLog());
}

renderer.getSpriteBatch().setShader(shader);

glow.batch.setShader(shader);

shader.begin();
shader.setUniformf("u_near", .2f);
shader.setUniformf("u_dim", .85f);
shader.end();

顶点着色器:

precision mediump float;

attribute vec4 a_color;
attribute vec3 a_position;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoord0;

void main() {
    v_color = a_color;
    v_texCoord0 = a_texCoord0;
    gl_Position = u_projTrans * vec4(a_position, 1.0);
}

fragment 着色器:

precision mediump float;

varying vec4 v_color;
varying vec2 v_texCoord0;

uniform vec2 u_lightPos;
uniform float u_radius;
uniform float u_near;
uniform float u_dim;
uniform sampler2D u_sampler2D;

void main() {
    vec4 color = texture2D(u_sampler2D, v_texCoord0) * v_color;

    vec2 relativePosition = (u_lightPos - gl_FragCoord.xy) / u_radius;
    float len = length(relativePosition);
    float vignette = smoothstep(.5, u_near, len);
    color.rgb = mix(color.rgb, color.rgb * vec3(vignette, vignette, color.b / 3), u_dim);

    gl_FragColor = color;
}

正确的结果是“晕影”或聚光灯效果。

目标安卓版本:4.4.2

MainActivity 包含

    cfg.useGL20 = true;

AndroidManifest 包含

    <uses-feature android:glEsVersion="0x00020000" android:required="true" />

编辑:我已正确设置项目,以便它们共享位于 Android 项目 Assets 文件夹中的 Assets ,包括着色器文件。

最佳答案

我用这个 http://shdr.bkcore.com/ 解决了我的问题.我还了解到 OpenGL ES 着色语言在某些方面不同于 GLSL。

我的问题出在 fragment 着色器中。因此,工作着色器是:

#ifdef GL_ES
precision highp float;
#endif

varying vec4 v_color;
varying vec2 v_texCoord0;

uniform vec2 u_lightPos;
uniform float u_radius;
uniform float u_near;
uniform float u_dim;
uniform sampler2D u_sampler2D;

void main() {
  vec4 color = texture2D(u_sampler2D, v_texCoord0) * v_color;

    vec2 relativePosition = (u_lightPos - gl_FragCoord.xy) / u_radius;
    float len = length(relativePosition);
    float vignette = smoothstep(.5, u_near, len);
  color.rgb = mix(color.rgb, color.rgb * vec3(vignette, vignette, color.b / 3.), u_dim);
    // "color.b / 3." instead of "color.b / 3"

    gl_FragColor = color;
}

我认为是非常基本的错误。定义 LOWP(这意味着什么?-最上面的部分)特定于 OpenGL ES。我还写了“3”而不是“3”。我想表达一个浮点值的地方。 (这里没有隐式类型转换,所以它会被当作一个整数,你不能用它来除 float 。)这是我第一次使用 GLSL。

关于java - 自定义着色器导致 Android 黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21118133/

相关文章:

java - 下载 Maven Artifact 并安装到特定的本地存储库(不是 .m2)

java - 同步块(synchronized block)不阻塞对象

java - 如何在不中断的情况下停止while循环

Android map 设置多个标记不可见

iphone - 如何通过滑动手势确定 3-D 对象的旋转角度?

opengl-es - OpenGL - 我应该存储属性/统一位置吗?

ios - iPad Opengl ES 程序在模拟器上运行良好但在设备上运行不正常

java - 如何在 Eclipse 的上下文智能 'Java Search' 中获取行预览(相对于上下文未知的 'File Search' )

android - 谷歌如何检查刷新 token - 他们的 OAuth 2.0 的客户端绑定(bind)?

java - 从 Fragment 外部更新 TextView