2012-07-21 51 views
1

我想要一個統一的變種添加到我的着色器,這是我的着色器:libGDX:添加均勻VAR

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

問題帶有

均勻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"),它解析爲真,但是當我去看看shader.getUniformLocation("u_texturePalette")它解析爲-1

這是一個錯誤? 。任何想法我做得不好?

+0

你肯定着色器編譯和鏈接成功? – Tim 2012-07-21 16:49:32

+0

@Tim着色器編譯得很好,但我怎麼能看到它的鏈接好嗎? – 2012-07-21 18:37:32

+0

我對libGDX並不熟悉,但對於OpenGL來說,它就像'glGetProgramiv(program,GL_LINK_STATUS,retVal)'。查看libGDX支持哪種錯誤檢查。 – Tim 2012-07-21 18:59:28

回答

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