2013-11-03 26 views
0

我是新来的所有这个着色器的东西,而不是我只是试图取代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) 

回答

0

不知道,但也许u_mouse期待一个Vector2变量。尝试this.-

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

不,同样的错误。 –

3

这归结为,经过您的顶点着色器和你的片段着色器的输入的输出被确定的事实,所述接头意识到u_mouse不以任何活性代码中使用。

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

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

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

+0

要么我做错了什么,要么没有帮助...我尝试在vertex中声明v_color为LOWP,并删除片段中的LOWP声明。尽管v_color并不是什么新东西,但我所做的只是将其与u_mouse相乘。 –

0

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

相关问题