在GLSurfaceView上绘制2D

时间:2012-11-24 15:18:19

标签: android opengl-es glsurfaceview

我试图在2D模式下在GLSurfaceView上绘制2D正方形。我可以在3D模式下绘制对象,并测试了方形在3D空间中。然后我尝试为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 个答案:

答案 0 :(得分:1)

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

步骤1:尝试强制您的2d - 透视矩阵和模型视图矩阵为Identity Matrices。然后,如果您在剪辑空间内强制使用Square数据顶点(例如  x,y = + -1或x,y = + -0.75,z = 0,你应该会在屏幕上看到一个正方形。

步骤2:现在数据模型正确,检查模型视图和透视矩阵的作用:将每个方形顶点(x,y,z,w = 1)与ModelView Matrix * CameraMatrix * PerspectiveMatrix相乘。你得到了什么? x,y,z多在外面| w | ?

相关问题