OpenGL學習(一)

  OpenGL(全寫Open Graphics Library)是指定義了一個跨編程語言、跨平臺的編程接口規格的專業的圖形程序接口。在遊戲和特效領域,使用很是普遍。在移動平臺上Android支持了OpenGL ES。今天,我開始學習OpenGL ES 並在此記錄學習的過程。編程

  Android提供了GLSurfaceView,是一個支持OpenGL ES的控件,封裝了OpenGL的複雜流程。今天記錄一下它的使用方法。數組

  

public class MainActivity extends AppCompatActivity {

    private GLSurfaceView glSurfaceView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setRenderer(new GLSurfaceViewRender());
        setContentView(glSurfaceView);

    }

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


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


}

  GLSurfaceViewRender是咱們自定義的類,它實現了GLSurfaceView.Renderer的接口,封裝了GLSurfaceView的相關操做和生命週期。緩存

  

public class GLSurfaceViewRender implements GLSurfaceView.Renderer {

    private float[] mTriangleArray = {
            // X, Y, Z 這是一個等邊三角形
            -0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.4f, 0 };


    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // 設置背景顏色
        gl.glClearColor(0.9f, 0.8f, 1f, 0.9f);
        // 啓用頂點數組(不然glDrawArrays不起做用)
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // 設置輸出屏幕大小
        gl.glViewport(0, 0, width, height);


    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // 清除屏幕和深度緩存(若是不調用該代碼, 將不顯示glClearColor設置的顏色)
        // 一樣若是將該代碼放到 onSurfaceCreated 中屏幕會一直閃動
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        // 獲取顏色
        gl.glColor4f(1.0f, 0.4f, 0.4f, 0.8f);
        // 獲取形狀數組
        FloatBuffer mTriangleBuffer = BufferUtil
                .floatToBuffer(mTriangleArray);
        // 每一個點用幾個數字描述;
        // 每一個頂點座標的變量類型;
        // 取數據時的間隔,由於有些人習慣把顏色數據也放裏邊,若是這樣,你須要跳過這些點.意思就是每隔stride取一個點;
        // 每一個頂點的座標
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
        /**
         * 參數1:有三種取值
         1.GL_TRIANGLES:每三個頂之間繪製三角形,之間不鏈接
         2.GL_TRIANGLE_FAN:以V0V1V2,V0V2V3,V0V3V4,……的形式繪製三角形
         3.GL_TRIANGLE_STRIP:順序在每三個頂點之間均繪製三角形。這個方法能夠保證從相同的方向上全部三角形均被繪製。以V0V1V2,V1V2V3,V2V3V4……的形式繪製三角形

         參數2:從數組緩存中的哪一位開始繪製,通常都定義爲0
         參數3:頂點的數量
         */
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
        //  加載glLoadIdentity(),等因而將以前矩陣變換致使變化過的棧頂矩陣從新歸位,置爲單位矩陣!等因而以前的矩陣變換帶來的影響到此爲止了!
        gl.glLoadIdentity();
        // 平移 (矩陣相乘)
        gl.glTranslatef(-0.2f, 0.3f, 0f);

    }

    static class BufferUtil {
        public static FloatBuffer mBuffer;

        public static FloatBuffer floatToBuffer(float[] a) {
            // 先初始化buffer,數組的長度*4,由於一個float佔4個字節
            ByteBuffer mbb = ByteBuffer.allocateDirect(a.length * 4);
            // 數組排序用nativeOrder
            mbb.order(ByteOrder.nativeOrder());
            mBuffer = mbb.asFloatBuffer();
            mBuffer.put(a);
            mBuffer.position(0);
            return mBuffer;
        }
    }
}

  以上是用OpenGL 畫一個三角形的過程,註釋記錄詳細。編程語言

  初步的,就是這樣。ide

  Done~學習

相關文章
相關標籤/搜索