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

问题在于,在我的Samsung Galaxy Nexus上实现我编写的着色器会导致黑屏。它在桌面项目中产生正确的结果,并且Android项目在Eclipse中的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);
}


片段着色器:

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;
}


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

目标Android版本:4.4.2

MainActivity包含

    cfg.useGL20 = true;


AndroidManifest包含

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


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

最佳答案

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

我的问题出在片段着色器中。因此,工作着色器为:

#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”。我想表达一个浮点值。 (这里没有隐式的类型转换,因此将使用一个整数,您不能将其除以浮点数。)这是我第一次使用GLSL。

10-01 00:25
查看更多