Opengl libGDX:添加统一变量

Opengl libGDX:添加统一变量,opengl,shader,libgdx,Opengl,Shader,Libgdx,我正在尝试向我的着色器添加统一变量,这是我的着色器: String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" // + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" // + "attribute vec2 " + ShaderProgram.TEXCOORD_A

我正在尝试向我的着色器添加统一变量,这是我的着色器:

    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" //
            + "varying vec4 v_color;\n" //
            + "varying vec2 v_texCoords;\n" //
            + "\n" //
            + "void main()\n" //
            + "{\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 vec2 v_texCoords;\n" //
            + "uniform sampler2D u_texture;\n" //
            + "uniform sampler2D u_texturePalette;\n" //
            + "void main()\n"//
            + "{\n" //
            + " vec4 textureColor = texture2D(u_texture, v_texCoords).rgba;\n"
            + " vec4 paletteColor = texture2D(u_texturePalette, vec2(textureColor.b,0)).rgba;\n"    
            + "  gl_FragColor = paletteColor;\n" //
            + "}";
问题随之而来

均匀取样器2D u_纹理板

着色器程序无法识别着色器中的新统一。我也这样做了:

    shader = new ShaderProgram(vertexShader, fragmentShader);
    shader.setUniformi("u_texturePalette", 0);
    Texture text = new Texture(Gdx.files.internal("./data/palette.png"));
    text.bind(shader.getUniformLocation("u_texturePalette"));
    batch = new SpriteBatch();
    batch.setShader(shader);
当我调用函数
shader.hasUniform(“u\u TexturePalete”)
时,它解析为true,但当我去查看
shader.getUniformLocation(“u\u TexturePalete”)时,它解析为-1


这是虫子吗。知道我在做什么吗?

着色器代码看起来不错

通常您是这样做的:

shader = new ShaderProgram(vertexShader, fragmentShader);
Texture text = new Texture(Gdx.files.internal("./data/palette.png"));
text.bind(0);
shader.setUniformi("u_texturePalette", 0);
因此,将纹理绑定到活动纹理单元,然后通过
setUniformi()
传递该单元

getUniformLocation()
实际上做了一些不同的事情:

但是,您将在这里遇到更多问题,因为
SpriteBatch
在内部对自定义着色器执行一些非常具体的操作。我建议您查看一下代码:


具体来说,它希望默认纹理始终位于单位0。

着色器代码看起来很好

通常您是这样做的:

shader = new ShaderProgram(vertexShader, fragmentShader);
Texture text = new Texture(Gdx.files.internal("./data/palette.png"));
text.bind(0);
shader.setUniformi("u_texturePalette", 0);
因此,将纹理绑定到活动纹理单元,然后通过
setUniformi()
传递该单元

getUniformLocation()
实际上做了一些不同的事情:

但是,您将在这里遇到更多问题,因为
SpriteBatch
在内部对自定义着色器执行一些非常具体的操作。我建议您查看一下代码:


具体来说,它将期望默认纹理始终位于单位0。

您确定着色器编译和链接成功吗?@Tim着色器编译得很好,但我如何才能看到它链接正常?我对libGDX不太熟悉,但对于OpenGL,它类似于
glGetProgramiv(program,GL\u LINK\u STATUS,retVal)
。查看libGDX支持哪种错误检查。您确定着色器编译和链接成功吗?@Tim着色器编译得很好,但我如何才能看到它链接ok?我对libGDX不太熟悉,但使用OpenGL它类似于
glGetProgramiv(program,GL\u LINK\u STATUS,retVal)
。查看libGDX支持哪种类型的错误检查。