着色器中没有带名称的制服

时间:2013-11-03 15:27:20

标签: opengl libgdx shader

我是所有这些着色器的新手,而不是我只是想在LibGDX中替换默认的SpriteBatch渲染器。

我复制粘贴默认着色器并尝试添加鼠标制服,但它在着色器中为我提供了“没有制服名称'u_mouse'。

这是所有相关的代码:

     String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
             + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
             + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
             + "uniform mat4 u_projTrans;\n" //
             + "uniform vec2 u_mouse;\n" //
             + "varying vec4 v_color;\n" //
             + "varying vec2 v_texCoords;\n" //
             + "\n" //
             + "void main()\n" //
             + "{\n" //
             + "   v_color = u_mouse * " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
             + "   v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
             + "   gl_Position =  u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
             + "}\n";
     String fragmentShader = 
             "#ifdef GL_ES\n" //
             + "#define LOWP lowp\n" //
             + "precision mediump float;\n" //
             + "#else\n" //
             + "#define LOWP \n" //
             + "#endif\n" //
             + "varying LOWP vec4 v_color;\n" //
             + "varying vec2 v_texCoords;\n" //
             + "uniform sampler2D u_texture;\n" //
             + "uniform vec2 u_mouse;\n" //
             + "void main()\n"//
             + "{\n" //
             + "  gl_FragColor = v_color * texture2D(u_texture,  u_mouse);\n" //
             + "}";


ShaderProgram shaderTest = new ShaderProgram(vertexShader, fragmentShader);

shaderTest.setUniformf("u_mouse", Gdx.input.getX(),  Gdx.input.getY());

这是堆栈跟踪:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.IllegalArgumentException: no uniform with name 'u_mouse' in shader
    at     com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:113)
Caused by: java.lang.IllegalArgumentException: no uniform with name 'u_mouse' in shader
    at     com.badlogic.gdx.graphics.glutils.ShaderProgram.fetchUniformLocation(ShaderProgram.java:283)
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.setUniformf(ShaderProgram.java:394)
    at com.nehatchick.games.wf.WhiteMountains.render(WhiteMountains.java:424)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:187)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110)

3 个答案:

答案 0 :(得分:3)

这归结为以下事实:在确定顶点着色器的输出和片段着色器的输入之后,链接器意识到在任何 活动u_mouse > 代码。

换句话说,虽然在着色器中使用u_mouse来计算v_color,但v_color在顶点和片段阶段之间没有正确链接。顶点着色器中的精度与片段着色器中的精度不匹配,因此就GLSL而言,不使用顶点着色器中v_color的输出。

由于u_mouse不会影响您的关联程序,因此未为其分配统一编号。更重要的是,这种情况应至少产生一个链接器警告。我会在链接后检查glGetProgramInfoLog (...)的输出。

您可以通过在顶点着色器中声明v_color LOWP或删除片段着色器中的LOWP声明来更正我刚刚讨论过的所有内容。您只需要从顶点着色器输出并输入到片段着色器以获得匹配的变量声明。

答案 1 :(得分:0)

不确定,但也许u_mouse期待Vector2变量。试试这个.-

shaderTest.setUniformf("u_mouse", new Vector2(Gdx.input.getX(),  Gdx.input.getY()));

答案 2 :(得分:0)

尝试在批处理开始和结束之间调用它 batch.setShader(shaderTest); batch.begin(); shaderTest.setUniformf("u_mouse", Gdx.input.getX(), Gdx.input.getY()); batch.draw............... batch.end();