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~學習