2012-11-24 67 views
2

我试图在2D模式下在GLSurfaceView上绘制2D正方形。我可以在3D模式下绘制对象,并测试了方形在3D空间中。然后我尝试配置矩阵2d绘图,当我试图绘制我的对象没有出现。在GLSurfaceView上绘图2D

我的GLSurfaceView实例实现了GLSurfaceView.Renderer。

我已经打破了设置成两个功能:

private void prepare3Ddrawing(GL10 gl) 
{ 
    gl.glLoadIdentity(); 
    gl.glViewport(0, 0, getWidth(), getHeight()); 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 45.0f, (float)getWidth()/(float)getHeight(),0.1f,100.0f);  
} 
private void prepare2Ddrawing(GL10 gl) 
{ 
    gl.glDisable(GL10.GL_CULL_FACE); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl,0,getWidth(), 0, getHeight()); 
    gl.glScalef(1, -1, 1); 
    gl.glTranslatef(0, -getHeight(), 0); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
} 

这里是我的画法...

public void onDrawFrame(GL10 gl) 
{ 
    gl.glClear(GL10.GL_DEPTH_BUFFER_BIT|GL10.GL_COLOR_BUFFER_BIT); 
    prepare3Ddrawing(gl); 

    camera.draw(gl); 
    go2d.draw(gl); 

    prepare2Ddrawing(gl); 
    go2d.draw(gl); 

} 

最后,我go2d对象是对象的实例我创建名为GameObject2d。它的绘制方法看起来像这样...

@Override 
public void draw(GL10 gl) 
{ 
    super.draw(gl); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glEnable(GL10.GL_ALPHA_TEST); 
    gl.glAlphaFunc(GL10.GL_GREATER, 0.0f); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID); 

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glEnable(GL10.GL_BLEND); 


    gl.glFrontFace(GL10.GL_CW); 
    //gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glCullFace(GL10.GL_BACK); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

    gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_SHORT, indexBuffer); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    gl.glDisable(GL10.GL_CULL_FACE); 
    gl.glDisable(GL10.GL_ALPHA_TEST); 
    gl.glDisable(GL10.GL_TEXTURE_2D); 
} 

有没有人有任何想法?再次,我仍然能够看到go2D对象的3D渲染版本,但我没有看到2D版本。

谢谢。

+1

在呈现2D对象之前关闭深度测试... – Goz

+0

@Goz我相信我已关闭深度测试...检查prepare2Ddrawing方法调用在那里我然后调用gl.Disable(GL10.GL_DEPTH_TEST)。是不是正确?Thnx – Matthew

回答

1

由于您不包含任何数据,因此我只能提出两种方法来调试问题。

第1步:试图强制你的2D - 透视矩阵和模型视图矩阵是身份矩阵。然后,如果您强制您的Square数据顶点位于剪辑空间内(例如, x,y = + -1或x,y = + -0.75,z = 0,您应该看到屏幕上出现一个方块。 2:现在数据模型是正确的,请检查你的模型视图和透视矩阵:将每个正方形顶点(x,y,z,w = 1)与ModelView Matrix * CameraMatrix * PerspectiveMatrix相乘。是否x,y,z太多了| w |?

+0

谢谢Aki!我添加了一些随机的gl.glLoadIdentity()方法电话,现在我看到了2D版本!我会回去找出哪一个真的做到了!我感谢您的帮助! – Matthew