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)
4

3 回答 3

3

这归结为这样一个事实,在确定顶点着色器的输出和片段着色器的输入之后,链接器意识到在任何活动代码中u_mouse都没有使用它。

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

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

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

于 2013-11-03T22:13:52.400 回答
0

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

shaderTest.setUniformf("u_mouse", new Vector2(Gdx.input.getX(),  Gdx.input.getY()));
于 2013-11-03T16:57:52.770 回答
0

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

于 2016-03-12T10:47:31.720 回答