2012-05-31 281 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);  

} 

我的代碼有什麼問題?任何建議請....

+0

你確定三角形的排列順序嗎?出於測試目的,您可能需要禁用剔除。 – rioki

回答

11

在您的onDrawFrame方法初始化緩衝區看起來不正確。

我建議你創建一個頂點的基本矩形類指數作爲字段:

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); 
    } 

} 

一個Rectangle字段添加到您的渲染器和渲染器的構造函數初始化:

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

和呼叫Renderer的onDrawFrame方法中的矩形繪製方法:

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

請按照this tutorial的前三部分了解如何完成該工作的完整解決方案。

+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個頂點,但沒有進展。任何參考請。 –