2012-11-24 2 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 객체는 객체의 인스턴스입니다 I 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); 
} 

누구 아이디어가 있습니까? 다시 말하지만, 아직 3D 렌더링 된 go2D 객체의 버전을 볼 수는 있지만 2D 버전은 표시되지 않습니다.

감사합니다.

+1

2D 객체를 렌더링하기 전에 깊이 테스트를 해제하십시오 ... – Goz

+0

@Goz 깊이 테스트가 꺼져 있다고 생각합니다. prepare2Ddrawing 메서드 호출을 확인하십시오. 어디 그때 gl.Disable (GL10.GL_DEPTH_TEST) 호출합니다. 그게 정확하지? Thnx – Matthew

답변

1

데이터를 포함하지 않으므로이 문제를 디버그하는 두 가지 방법 만 제안 할 수 있습니다.

1 단계 : 2 차원 원근감 행렬과 모델 뷰 행렬을 항등 행렬로 강제 변환하십시오. 그런 다음 클립 공간 안에 정사각형 데이터 정점을 넣으면 (예 : x, y = + -1 또는 x, y = + -0.75, z = 0이면 화면에 정사각형이 보입니다.)

단계 2 : 이제 데이터 모델이 올바른지, 모델 뷰와 퍼스펙티브 매트릭스가 무엇인지 확인하십시오 : 정사각형의 각 정점 (x, y, z, w = 1)에 ModelView Matrix * CameraMatrix * PerspectiveMatrix를 곱하면됩니다. x, y, z가 많이 떨어져 있지 않습니까?

+0

감사합니다 아키! 몇 가지 임의의 gl.glLoadIdentity() 메서드를 추가했습니다 전화를 걸면 2D 버전을 볼 수 있습니다! 나는 돌아가서 어느 것이 실제로 그것을했는지를 발견 할 것이다! 도와 줘서 고마워! – Matthew