2012-05-31 183 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个顶点,但没有进展。任何参考请。 –