opengl - 着色器中没有名称为 'u_proj' 的制服

标签 opengl opengl-es libgdx glsl shader

我编写了一对着色器来将纹理显示为灰度而不是全色。我将这些着色器与 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/

相关文章:

cocoa - 使用 Cocoa 将图像加载到 OpenGL 纹理

c++ - 如何用数组初始化 glm::mat4?

Android GLSurfaceView在ScrollView中产生黑边

某些设备上的 Android 'white box' 纹理 OpenGL ES 1.0

java - Java 8 藏在哪里?

math - 正确的 glsl 仿射纹理映射

java - LWJGL:在线程之间传递OpenGL上下文

安卓屏幕录像

java - libgdx 中重叠时出现 NullPointerException (Java)

java - 恢复后 Libgdx 调整大小