2012-05-31 6 views
0

android opengl을 사용하여 사각형을 그리려하고 있습니다. 직사각형은 화려한 배경 안에서 형성됩니다. 코드를 실행 한 후에는 배경을 볼 수 있지만 내부에는 사각형이 표시되지 않습니다.OpenGL에서 드로잉 사각형 android

public void onDrawFrame(GL10 gl) 
{ 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);   
    gl.glClearColor(0.4f, 0.5f, 0.6f, 0.5f); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
    float[] vertices= 
    { 
      -1.0f, 1.0f, 0.0f, 
      -1.0f, -1.0f, 0.0f, 
      1.0f, -1.0f, 0.0f, 
      1.0f, 1.0f, 0.0f,    
    }; 
    short[] indices = { 0, 1, 2, 0, 2, 3 };  
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
    vbb.order(ByteOrder.nativeOrder()); 
    FloatBuffer vertexBuffer = vbb.asFloatBuffer(); 
    vertexBuffer.put(vertices); 
    vertexBuffer.position(0);  
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); 
    ibb.order(ByteOrder.nativeOrder()); 
    ShortBuffer indexBuffer = ibb.asShortBuffer(); 
    indexBuffer.put(indices); 
    indexBuffer.position(0); 
    gl.glFrontFace(GL10.GL_CCW); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glCullFace(GL10.GL_BACK); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  
    gl.glColor4f(0.5f, 0.3f, 0.3f, 0.7f); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, 
    GL10.GL_UNSIGNED_SHORT, indexBuffer); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisable(GL10.GL_CULL_FACE); 
} 
public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 45.0f, 
    (float) width/(float) height, 
    0.1f, 100.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

} 
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) 
{ 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);  

} 

내 코드에 무슨 문제가 있습니까? 당신의 onDrawFrame 방법에 버퍼를 초기화 어떤 제안하시기 바랍니다 ....

+0

삼각형의 와인딩 순서는 확실합니까? 테스트 목적으로 컬링을 비활성화 할 수 있습니다. – rioki

답변

11

가 제대로 보이지 않습니다.

은 당신이 정점에 기본 Rectangle 클래스를 생성 제안하고 필드로와 indices :

public class Rectangle { 

    private float vertices[]={ 
     -1.0f, 1.0f, 0.0f, 
     -1.0f,-1.0f,0.0f, 
     1.0f,-1.0f,0.0f, 
     1.0f,1.0f,0.0f 
    }; 


    private short[] indices = {0,1,2,0,2,3}; 

    private FloatBuffer vertexBuffer; 
    private ShortBuffer indexBuffer; 

    public Rectangle(){ 
     ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
     vbb.order(ByteOrder.nativeOrder()); 
     vertexBuffer = vbb.asFloatBuffer(); 
     vertexBuffer.put(vertices); 
     vertexBuffer.position(0); 

     ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); 
     ibb.order(ByteOrder.nativeOrder()); 
     indexBuffer = ibb.asShortBuffer(); 
     indexBuffer.put(indices); 
     indexBuffer.position(0); 
    } 

    public void draw(GL10 gl){ 
     gl.glFrontFace(GL10.GL_CCW); 
     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, indices.length, GL10.GL_UNSIGNED_SHORT, indexBuffer); 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glDisable(GL10.GL_CULL_FACE); 
    } 

} 

이 렌더러에 사각형 필드를 추가하고 렌더러의 생성자에서 초기화 :

public MyOpenGLRenderer() { 
    mRectangle = new Rectangle(); 
} 

및 전화 렌더러의 onDrawFrame 메서드에있는 Rectangle의 그리기 메소드 :

public void onDrawFrame(GL10 gl) { 
    //... 
    mRectangle.draw(gl); 
} 

this tutorial의 처음 3 부분에 따라 수행 방법에 대한 완벽한 해결책을 찾아보십시오.

+0

질문에있는 코드의 내용이 정확히 무엇인지 말할 수는 없지만이 대답은 어쨌든 정상적인 솔루션처럼 보입니다. 버퍼는 모든 프레임이 아니라 한 번 할당되어야합니다. – rioki

+1

덕분에, 나는 직선과 직사각형을 그리는 과정에서 똑같은 절차를 사용하지만 삼각형을 그렸습니다. –

+0

@ Tauhidul Alam. 이 튜토리얼을 살펴 보길 원할 수도 있습니다 - 섹션 2.4 :(http : //www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D)에서 사각형을 그리는 방법을 설명합니다. html –

1

귀하의 삼각형 가까운면 뒤에 있습니다. 카메라는 z = 0, 가까운 평면은 0.1f, 삼각형은 z = 0에 있습니다.

어느은 -z 축 방향으로 상기 삼각형을 그리거나, Z> 0.1F로 카메라를 설정.

는 또한 GL_TRIANGLES와 사각형을 그리려면 6 개 정점을 필요로하지 4. 당신은 여전히 ​​뭔가를하지만 볼 수 있습니다.

+0

덕분에, 나는 6 개의 꼭지점을 가지고 있지만 진행하지는 않았다. 어떤 참조하시기 바랍니다. –