【问题标题】:libGDX:Adding uniform varlibGDX:添加统一变量
【发布时间】:2012-07-21 13:54:12
【问题描述】:

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

    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" //
            + "}";

问题来了

uniform sampler2D u_texturePalette;

ShaderProgram 无法识别着色器中的新制服。我也这样做了:

    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_texturePalette") 时,它解析为 true ,但是当我去查看 shader.getUniformLocation("u_texturePalette") 时,它解析为 -1

这是一个错误吗? .知道我做错了什么吗?

【问题讨论】:

  • 你确定shader编译链接成功了吗?
  • @Tim 着色器编译得很好,但是我怎么看它链接正常?
  • 我对 libGDX 不太熟悉,但对于 OpenGL,它会类似于 glGetProgramiv(program, GL_LINK_STATUS, retVal)。看看 libGDX 支持哪种错误检查。

标签: opengl shader libgdx


【解决方案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() 实际上做了一些不同的事情:https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetUniformLocation.xml

但是您会在这里遇到更多问题,因为SpriteBatch 在内部使用自定义着色器做了一些非常具体的事情。我建议你看一下代码: https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/SpriteBatch.java

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

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2018-11-08
    • 2016-05-17
    • 2020-05-04
    相关资源
    最近更新 更多