1. 程式人生 > >android-glsurfaceview Activity框架程序

android-glsurfaceview Activity框架程序

環境變量 ont color rust 投影 oncreate exp long 基本

兩個基本的類讓我們使用OpenGL ES API來創建和操縱圖形:GLSurfaceView和 GLSurfaceView.Renderer。

1. GLSurfaceView:

這是一個視圖類,你可以調用OpenGL API在上面繪制圖形和操縱物體,功能和SurfaceView相似。我們可以創建一個GLSurfaceView類的實例,並添加自己的渲染器。如果我們要自己實現一些觸摸屏的操作,我們必須擴展這個類來實現觸摸監聽器。

2. GLSurfaceView.Renderer

這個接口定義了在一個OpenGL的GLSurfaceView中繪制圖形所需要的方法。我們必須在一個單獨的類中為這些接口提供實現,並使用GLSurfaceView.setRenderer()方法將它依附到GLSurfaceView實例對象上。

我們需要實現GLSurfaceView.Renderer的以下方法:

a) onSurfaceCreated():系統在創建GLSurfaceView時調用它一次。我們可以使用它來設置OpenGL的環境變量,或是初始化OpenGL的圖形物體。

b) onDrawFrame():系統在每次重繪GLSurfaceView時調用這個方法。這個方法主要完成繪制圖形的操作。

c) onSurfaceChanged():系統在GLSurfaceView的幾何屬性發生改變時調用該方法,包括大小或是設備屏幕的方向發生變化。例如,系統在屏幕從直立變為水平使調用它。這個方法主要用來對GLSurfaceView容器的變化進行響應。

3.使用步驟

a.定義render

public class SunnyGLRender implements GLSurfaceView.Renderer {

        public float mAngle;
        float one = 0.5f;
        private FloatBuffer triggerBuffer2 = BufferUtil.floatToBuffer(new float []{
                0,one,0, //上頂點
                -one,-one,0, //左下點
                one,-one,0,}); //
右下點 private FloatBuffer triggerBuffer1 = BufferUtil.floatToBuffer(new float []{ 0,one,0, //上頂點 -one,-one,0, //左下點 one,-one,0,}); //右下點 private float[] mTriangleArray = { // X, Y, Z 這是一個等邊三角形 -0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.559016994f, 0 }; @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { //GLES30:為OpenGL ES2.0版本,相應的 //GLES30:OpenGL ES3.0 //黑色背景 gl.glClearColor(0.0f, 0f, 1f, 0.5f); //gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // 啟用頂點數組(否則glDrawArrays不起作用) gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { //mProgram = GLES30.glCreateProgram(); //Log.e("zcxgl", "Could not link program: mProgram = "+mProgram); Log.e("zcxgl","onSurfaceChanged"); float ratio = (float) width / height; gl.glMatrixMode(GL10.GL_PROJECTION); // 設置當前矩陣為投影矩陣 gl.glLoadIdentity(); // 重置矩陣為初始值 //gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 根據長寬比設置投影矩陣 gl.glFrustumf(-ratio, ratio, -1, 1, 5, 6); } private FloatBuffer colorBuffer2 = BufferUtil.floatToBuffer(new float[]{ one,0,0,one, 0,one,0,one, 0,0,one,one, }); @Override public void onDrawFrame(GL10 gl) { // Redraw background color Log.d("zcxgl","onDrawFramew"); gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); /************ 啟用MODELVIEW模式,並使用GLU.gluLookAt()來設置視點 ***************/ // 設置當前矩陣為模型視圖模式 gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // reset the matrix to its default state // 設置視點 GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); /*****************************************/ long time = SystemClock.uptimeMillis() % 4000L; mAngle = 0.090f * ((int)time); // 重置當前的模型觀察矩陣 gl.glLoadIdentity(); // 移動繪圖原點的坐標與上面的語句連用就相當於設置新的繪圖遠點坐標, //gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);//後面的1-10是指圖像的1-10層, // 圖像所處層次越大,在屏幕上顯示就越小。默認為(0,0,1), // 左移 1.5 單位,並移入屏幕 6.0。 gl.glTranslatef(0f, 0.0f, -5.0f); gl.glRotatef(mAngle, 0.0f, 0.0f, 1.0f); //啟用平滑著色 gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// //gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);//可以直接設置繪圖的單調顏色 // 設置三角形點 // gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer); gl.glVertexPointer(3,GL10.GL_FLOAT,0,triggerBuffer2); //設置平滑著色的顏色矩陣 gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuffer2);//都是一維矩陣,因此第一個參數就是表示一個顏色的長度表示 //繪制 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // 關閉顏色平滑著色設置 gl.glDisableClientState(GL10.GL_COLOR_ARRAY); //gl.glFinish(); } }

2.使用glsurfaceview 並設置render

private GLSurfaceView mGLSurfaceView;
    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;
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView();
        mGLSurfaceView.setRenderer(new SunnyGLRender());
        setContentView(mGLSurfaceView);
    }

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

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

    private void initView() {
        mGLSurfaceView = new GLSurfaceView(this);
    }

3.效果

技術分享

android-glsurfaceview Activity框架程序