1

シェーダーに均一な変数を追加しようとしています。これは私のシェーダーです。

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

問題は

均一なsampler2Du_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に解決されます

これはバグですか?。私が悪いことをしていることについて何か考えはありますか?

4

1 に答える 1

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 であることを期待します。

于 2012-07-24T11:40:11.513 に答える