2014-11-25 85 views
2

我想用libGDX中的Mesh類做一個簡單的漸變。這應該是一個包含漸變的繪製矩形,但問題是矩形是完全黑色的!Libgdx - 黑屏神祕

我的代碼:

public class HomeScreen extends 
         ScreenAdapter { 

    OrthographicCamera camera; 
    Mesh    mesh; 
    ShaderProgram  shader; 

    public HomeScreen() { 
     Logger.message("HomeScreen()", "^"); 
     this.camera = new OrthographicCamera(2, 2); 
     this.mesh = new Mesh(false, 4, 4, 
           new VertexAttribute(Usage.Position, 3, ShaderProgram.POSITION_ATTRIBUTE), 
           new VertexAttribute(Usage.ColorPacked, 4, ShaderProgram.COLOR_ATTRIBUTE) 
       ); 
     this.shader = SpriteBatch.createDefaultShader(); 

     this.camera.position.set(0, 0, 0); 
     this.camera.update(); 
     this.mesh.setVertices(new float[] { 
       -0.5f, -0.5f, 0, Color.BLUE.toFloatBits(), 
       -0.5f, 0.5f, 0, Color.RED.toFloatBits(), 
       0.5f, 0.5f, 0, Color.RED.toFloatBits(), 
       0.5f, -0.5f, 0, Color.BLUE.toFloatBits(), 
     }); 
     this.mesh.setIndices(new short[] { 
       0, 1, 3, 2 
     }); 
     Logger.message("HomeScreen()", "$"); 
    } 

    @Override 
    public void dispose() { 
     Logger.message("HomeScreen.dipose()", "^"); 
     this.mesh.dispose(); 
     this.shader.dispose(); 
     Logger.message("HomeScreen.dipose()", "$"); 
    } 

    @Override 
    public void render(final float delta) { 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     this.shader.begin(); 
     this.shader.setUniformMatrix("u_projTrans", this.camera.combined); 
     this.mesh.render(this.shader, GL20.GL_TRIANGLE_STRIP); 
     this.shader.end(); 
    } 
} 

結果:

http://snag.gy/oduhL.jpg

任何想法?

+1

查看默認的spritebatch着色器,可以看到該着色器需要一個紋理並計算最終顏色爲'gl_FragColor = v_color * texture2D(u_texture,v_texCoords);'。由於您沒有提供紋理,因此您最有可能將v_color乘以零向量。 – BDL 2014-11-25 11:27:26

+0

@BDL我寫了我自己的着色器,沒有紋理部分,實際上它的工作。謝謝 – Flawyte 2014-11-25 11:41:55

+0

@BDL你可以發表這個答案,所以我可以接受嗎? – Flawyte 2014-11-25 11:42:25

回答

5

libgdx中SpriteBatches的默認着色器需要紋理才能起作用。當在尋找shader code,一會看到,最終的結果是頂點顏色的組合物和紋理顏色:

gl_FragColor = v_color * texture2D(u_texture, v_texCoords); 

當不供給紋理,頂點顏色將通過[0,0相乘,0,0],這會導致黑色輸出。