我编写了一对着色器来将纹理显示为灰度而不是全色。我将这些着色器与 libGDX 内置的 SpriteBatch 类一起使用,并且效果很好。然后当我尝试将它与内置的 SpriteCache 类一起使用时,它不起作用。我查看了 SpriteCache 代码,发现它设置了一些我试图考虑的不同制服,但我似乎在某处出错了。
libGDX 中的 SpriteCache 类设置以下统一:
customShader.setUniformMatrix("u_proj", projectionMatrix);
customShader.setUniformMatrix("u_trans", transformMatrix);
customShader.setUniformMatrix("u_projTrans", combinedMatrix);
customShader.setUniformi("u_texture", 0);
这是我的顶点着色器:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_proj;
uniform mat4 u_projTrans;
uniform mat4 u_trans;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
v_color = a_color;
v_texCoords = a_texCoord0;
gl_Position = a_position* u_proj * u_trans;
}
这是片段着色器:
varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform u_projTrans;
void main() {
vec4 color = texture2D(u_texture, v_texCoords).rgba;
float gray = (color.r + color.g + color.b) / 3.0;
vec3 grayscale = vec3(gray + 0* u_projTrans[0][0]);
gl_FragColor = vec4(grayscale, color.a);
}
我得到的错误是:
Exception in thread "LWJGL Application" java.lang.IllegalArgumentException: no uniform with name 'u_proj' in shader
...
com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)ackends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
我想你们中有人知道为什么这不起作用吗?有一个名为 u_proj 的制服。
谢谢你们!
最佳答案
Reto Koradi 说的是真的,我忘记在 u_projTrans 之前放一个 mat4 标签,这对我有帮助。
那么 Tenfour04 所说的也是一个巨大的帮助!我不知道:
if (!shader.isCompiled()) throw new GdxRuntimeException("Couldn't compile shader: " + shader.getLog());
从长远来看,对我帮助最大的是发现 glsl 在编译时会取消未使用的导入,并且如果您无法欺骗编译器认为使用了未使用的导入,着色器将编译然后崩溃在运行时。
在 libgdx 中,您可以设置一个静态的“迂腐”变量。如果将其设置为 false,则在将变量发送到着色器未使用的着色器时,应用程序不会崩溃,它们将被简单地忽略。我的 libgdx 程序中的代码如下所示:
ShaderProgram.pedantic = false;
感谢大家的帮助!我希望这可以帮助将来的某人
关于opengl - 着色器中没有名称为 'u_proj' 的制服,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835347/