2012-11-24 92 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