Android OpenGL教程 二 2D形狀畫畫

來源:互聯網
上載者:User

標籤:height   自訂   str   rem   main   strip   意思   轉換   代碼   

首先畫個三角形

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

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, mTriangleArray.length/3);

然後畫個兩個三角形拼成一個正方形,把之前的座標換一下就好了

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

看來glDrawArrays是三個三個座標來畫的

我現在使用glDrawElements這個函數來畫正方形,這函數不僅可以畫多方形,而且還可以畫3D

    private float[] mTriangleArray={            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 float[] mColor ={            1.0f,0.0f,0.0f,1.0f,            1.0f,0.0f,0.0f,1.0f,            1.0f,0.0f,0.0f,1.0f,            1.0f,0.0f,0.0f,1.0f    };    private byte[] cubeFacets = new byte[]{            0, 1, 2,            0, 2, 3    };        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);        gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP                , cubeFacetsBuffer.remaining(),                GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);

這函數的意思是你傳他畫三個點的座標組的位置(第一個從0開始,一個座標組有三個float),比如這個cubeFacets就是說0、1、2三個座標連起來畫個三角形,然後0、2、3座標畫個三角形。

以下是完整代碼

public class MainActivity extends Activity {
private GLSurfaceView mGLView;

public void onCreate(Bundle savedInstanceState){    super.onCreate(savedInstanceState);    mGLView = new GLSurfaceView(this); //這裡使用的是自訂的GLSurfaceView的子類    mGLView.setRenderer(new GLRenderer());    setContentView(mGLView);}public void onPause(){    super.onPause();    mGLView.onPause();}public void onResume(){    super.onResume();    mGLView.onResume();}public class GLRenderer implements GLSurfaceView.Renderer {    private float[] mTriangleArray={            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 float[] mColor ={            1.0f,0.0f,0.0f,1.0f,            1.0f,0.0f,0.0f,1.0f,            1.0f,0.0f,0.0f,1.0f,            1.0f,0.0f,0.0f,1.0f    };    private byte[] cubeFacets = new byte[]{            0, 1, 2,            0, 2, 3    };    private FloatBuffer mTriangleBuffer;    private FloatBuffer mColorBuffer;    ByteBuffer cubeFacetsBuffer;    public GLRenderer() {        mTriangleBuffer = floatBufferUtil(mTriangleArray);        mColorBuffer = floatBufferUtil(mColor);        cubeFacetsBuffer = ByteBuffer.wrap(cubeFacets);    }    @Override    public void onDrawFrame(GL10 gl) {        // 清除螢幕和深度緩衝        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);        // 設定當前矩陣模式為模型視圖。        gl.glMatrixMode(GL10.GL_MODELVIEW);        // 允許設定頂點        //GL10.GL_VERTEX_ARRAY頂點數組        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);        // 允許設定顏色        //GL10.GL_COLOR_ARRAY顏色數組        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);        // 重設當前的模型觀察矩陣        gl.glLoadIdentity();        //將三角形在z軸上移動        gl.glTranslatef(0f, 0.0f, -2.0f);        // 設定三角形        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);        // 設定三角形顏色        gl.glColorPointer(4, GL10.GL_FLOAT, 0, mColorBuffer);        // 繪製三角形        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP                , cubeFacetsBuffer.remaining(),                GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);        // 取消顏色設定        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);        // 取消頂點設定        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);        //繪製結束        gl.glFinish();    }    @Override    public void onSurfaceChanged(GL10 gl, int width, int height) {        float ratio = (float) width / height;        // 設定OpenGL情境的大小,(0,0)表示視窗內部視口的左下角,(w,h)指定了視口的大小        gl.glViewport(0, 0, width, height);        // 設定投影矩陣        gl.glMatrixMode(GL10.GL_PROJECTION);        // 重設投影矩陣        gl.glLoadIdentity();        // 設定視口的大小        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);        //以下兩句聲明,以後所有的變換都是針對模型(即我們繪製的圖形)        gl.glMatrixMode(GL10.GL_MODELVIEW);        gl.glLoadIdentity();    }    @Override    public void onSurfaceCreated(GL10 gl, EGLConfig config) {        // 設定白色為清屏        gl.glClearColor(1, 1, 1, 1);    }}// 定義一個工具方法,將float[]數群組轉換為OpenGL ES所需的FloatBufferprivate FloatBuffer floatBufferUtil(float[] arr){    FloatBuffer mBuffer;    // 初始化ByteBuffer,長度為arr數組的長度*4,因為一個int佔4個位元組    ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);    // 數組排列用nativeOrder    qbb.order(ByteOrder.nativeOrder());    mBuffer = qbb.asFloatBuffer();    mBuffer.put(arr);    mBuffer.position(0);    return mBuffer;}

}

Android OpenGL教程 二 2D形狀畫畫

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.