2013-08-04 52 views
0

我试图在Libgdx中随着舞台呈现纹理网格。当我将stage.draw放在mesh.render()之上时,我有问题渲染纹理。Libgdx网格渲染连同舞台

案例1:

public void render(float delta) { 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    Gdx.gl.glEnable(GL10.GL_TEXTURE_2D); 

    stage.act(delta); 
    stage.draw(); 
    texture.bind(); 
    mesh.render(GL10.GL_TRIANGLES, 0, 3); 

} 

// -- This is in my create method: 
     mesh = new Mesh(true, 3, 3, 
       new VertexAttribute(Usage.Position, 3, "a_position"), 
       new VertexAttribute(Usage.ColorPacked, 4, "a_color"), 
       new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords")); 

     mesh.setVertices(new float[] { 50, 50, 0,Color.toFloatBits(255, 0, 0, 255),0,1, 
             50, 500, 0,Color.toFloatBits(0, 255, 0, 255),0,0, 
             500, 50, 0, Color.toFloatBits(0, 0, 255, 255),1,1             }); 

     mesh.setIndices(new short[] { 0, 1, 2 }); 

在上述情况下,我不能够呈现的质感,但能够呈现梯度三角形。

案例2:

public void render(float delta) { 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    Gdx.gl.glEnable(GL10.GL_TEXTURE_2D); 

    texture.bind(); 
    mesh.render(GL10.GL_TRIANGLES, 0, 3); 
    stage.act(delta); 
    stage.draw(); 
} 

在这种情况下,我能够正确地渲染纹理上的三角形。

我的问题:

  1. 为什么的stage.draw()顺序和mesh.render()影响质感,虽然我能画出三角形。
  2. 如何在演员的draw方法中使用纹理绘制网格?

回答

2

OpenGL是一个“有状态”库(因此,通过调用OpenGL所做的更改会一直持续到更改)。因此,stage.draw()调用中的某些内容正在改变OpenGL状态,使网格的纹理无法正常工作。

你可以尝试移动:

Gdx.gl.glEnable(GL10.GL_TEXTURE_2D); 

通话来与你:

texture.bind(); 
mesh.render(GL10.GL_TRIANGLES, 0, 3); 

我没想到舞台将未启用纹理,但它看起来像它可能。

此外,如果你想直接从演员的draw回调中绘制网格,你可能需要endbatch并重新启动您的左右非批处理图。批处理结构在其调用beginend调用之间对OpenGL状态进行了假设,因此如果更改状态,可能会感到困惑。有关示例,请参阅libgdx - ShapeRenderer in Group.draw renders in wrong colour

+0

谢谢你的作品。看起来像舞台在其逻辑中的某处禁用了纹理绑定。 – alexb

0

对不起,这只是一个猜测:尝试添加

Gdx.gl10.glActiveTexture(GL10.GL_TEXTURE0); 

拉网和舞台之间,或之后,或者之前......我也有类似的问题,在这里我想用着色器和BitmapFonts

+0

Libgdx'texture.bind()'调用应该可以实现这一点。 –