2012-02-11 97 views
0

这是我为了使2D绘图工作而编写的代码。活动以及视图和渲染器的设置都是正确的。我得到一个完全黑色的屏幕,但没有多边形。没有画。这是关于我逼疯......无法让opengl ES在Android上以2D绘制任何东西

public class OpenGLActivity extends Activity { 

    private GLSurfaceView surfaceView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(
       WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN 
       ); 

     this.surfaceView = new OpenGLSurfaceView(this); 
     setContentView(this.surfaceView); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     surfaceView.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     surfaceView.onResume(); 
    } 
} 

public class OpenGLSurfaceView extends GLSurfaceView { 

    private OpenGLSurfaceRenderer renderer; 

    public OpenGLSurfaceView(Context context) { 
     super(context); 
     this.renderer = new OpenGLSurfaceRenderer(); 
     setRenderer(renderer); 
    } 

} 

public class OpenGLSurfaceRenderer implements Renderer { 

    private FloatBuffer vertexBuffer; 
    private float[] vertices = { 
      0.0f, 1.0f, 0.0f, 
      0.0f, 0.0f, 0.0f, 
      1.0f, 1.0f, 0.0f, 
      1.0f, 0.0f, 0.0f, 
      0.0f, 10.0f, 0.0f, 
      0.0f, 0.0f, 0.0f, 
      10.0f, 10.0f, 0.0f, 
      10.0f, 0.0f, 0.0f 
    }; 

    public OpenGLSurfaceRenderer() { 
     ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * (Float.SIZE >> 3)); 
     vertexBuffer = byteBuffer.asFloatBuffer(); 
     vertexBuffer.put(vertices); 
     vertexBuffer.position(0); 
    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 

     gl.glClearColor(0.0f, 0.0f, 0.0f, 1); 
     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glDisable(GL10.GL_DEPTH_TEST); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 

     gl.glDisable(GL10.GL_DITHER); 
     gl.glDisable(GL10.GL_LIGHTING); 

     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    } 

    public void onDrawFrame(GL10 gl) { 

     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

     gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
     gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

     gl.glTranslatef(0.0f, 0.0f, 0.5f); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 
    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 

     gl.glViewport(0, 0, width, height); 

     // Clear the projection matrix 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 

     // Set up orthographic projection mode (2D drawing) 
     gl.glOrthof(0, width, height, 0, 0, 1); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
    } 

} 
+0

您的活动代码在哪里? ...实例化GLSurfaceView并将其渲染器设置为OpenGLSurfaceRenderer, – 2012-02-11 16:05:35

+0

添加了我的活动和视图代码。 – 2012-02-11 16:10:39

回答

1

我看四个方面的问题:

  1. )的最后一个参数(4,8应该是8,而不是4.这是你的顶点数量而不是三角形条上的三角形数量。

  2. 你的正射投影使你的世界单位相当于像素。您的前4个顶点描述的是1像素宽的三角形。也许你正在屏幕左下角获得一个白色像素?

  3. 您沿每个框架的Z轴推进模型投影。两帧后,它将会出现在视野之外。

  4. 最重要的是,您不要在ByteBuffer上设置正确的顺序。插入此行到您的OpenGlRenderer()构造函数:

    公共OpenGLSurfaceRenderer(){ 的ByteBuffer字节缓冲区= ByteBuffer.allocateDirect(vertices.length * 4); byteBuffer.order(ByteOrder.nativeOrder()); < ------ vertexBuffer = byteBuffer.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); }

+0

我有8个顶点的原因是我试图创建一个1x1的矩形和另一个10x10像素宽的矩形。我将它们添加到同一个vertexBuffer中,以便能够轻松切换。我也试图绘制一个100x100,我已经使用了负坐标值,但仍然没有结果。 – 2012-02-11 16:26:53

+0

如果我更改了gl.glClearColor,我的屏幕上又获得了另一种颜色,所以看起来OpenGL确实有所作为。 – 2012-02-11 16:35:51

+0

我看到你启用了贴图功能,但不要做任何贴图。建议除去gl.glEnable(GL10.GL_TEXTURE_2D);或将其更改为glDisable。 – 2012-02-11 16:49:42