2012-02-11 100 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