我正在尝试使用自定义着色器让libgdx项目在Android上运行。我还没弄明白如何进行USB调试,所以在真正的Android设备上运行时似乎无法获取任何日志。
问题是实现我写的着色器导致我的三星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项目资产文件夹中的资产,包括着色器文件。
答案 0 :(得分:1)
我用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。