aliang study opengles(1.2)_GLSurfaceView

GLSurfaceView

前言:上篇1.1講解了opengles畫(huà)三角形的opengles準(zhǔn)備工作,三角形準(zhǔn)備好以后,需要一個(gè)容器去顯示它,這篇就理解一下GLSurfaceView

一.GLSurfaceView

GLSurfaceView的使用過(guò)程就像是建造房子的過(guò)程.

  1. GLSurfaceView就像是當(dāng)前建屋所處的地皮
  2. GlSurfaceView里的Renderer就像是建筑工人,它們會(huì)做三件事情:
    1. onSurfaceCreated() 為建房子做準(zhǔn)備工作(水泥,設(shè)備,搭架等就等同于opengles中準(zhǔn)備繪制的圖形,坐標(biāo),顏色等數(shù)據(jù))
    2. onSurfaceChanged API的解釋是當(dāng)surface大小改變的時(shí)候會(huì)去觸發(fā)的,就相當(dāng)于房子設(shè)計(jì)方案
    3. onDrawFrame 就是具體實(shí)施造屋過(guò)程了,在Android ondrawFrame繪制每一幀的時(shí)候,都會(huì)去調(diào)用該函數(shù),所以在它里面進(jìn)行不要去申請(qǐng)內(nèi)存

二.GLSurfaceView具體代碼:

public class MyTDView extends GLSurfaceView
{
    final float ANGLE_SPAN = 0.375f;
    
    RotateThread rthread;
    SceneRenderer mRenderer;
    public MyTDView(Context context)
    {
        super(context);
        this.setEGLContextClientVersion(2);
        mRenderer=new SceneRenderer();
        this.setRenderer(mRenderer);
        this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    }
    private class SceneRenderer implements GLSurfaceView.Renderer
    {
        Triangle tle;
        public void onDrawFrame(GL10 gl)
        {   
            //清除深度緩沖與顏色緩沖
            GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
            //繪制三角形對(duì)
            tle.drawSelf();    
        }
        public void onSurfaceChanged(GL10 gl, int width, int height)
        {   
            
            //設(shè)置視窗大小及位置 
            GLES20.glViewport(0, 0, width, height); 
            //計(jì)算GLSurfaceView的寬高比
            float ratio = (float) width / height;
            //調(diào)用此方法計(jì)算產(chǎn)生透視投影矩陣
            Matrix.frustumM(Triangle.mProjMatrix, 0, -ratio, ratio, -1, 1, 1, 10);
            //調(diào)用此方法產(chǎn)生攝像機(jī)9參數(shù)位置矩陣
            Matrix.setLookAtM(Triangle.mVMatrix, 0, 0,0,3,0f,0f,0f,0f,1.0f,0.0f); 
        }
        public void onSurfaceCreated(GL10 gl, EGLConfig config)
        {    
            //設(shè)置屏幕背景色RGBA
            GLES20.glClearColor(0,0,0,1.0f);  
            //創(chuàng)建三角形對(duì)對(duì)象 
            tle=new Triangle(MyTDView.this);        
            //打開(kāi)深度檢測(cè)
            GLES20.glEnable(GLES20.GL_DEPTH_TEST);
            rthread=new RotateThread();
            rthread.start();
        }
    }
    public class RotateThread extends Thread
    {
        public boolean flag=true;
        @Override
        public void run()
        {
            while(flag)
            {
                mRenderer.tle.xAngle=mRenderer.tle.xAngle+ANGLE_SPAN;
                try
                {
                    Thread.sleep(20);
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}

關(guān)鍵代碼進(jìn)行說(shuō)明:

GLES20.glViewport(0, 0, width, height); 
float ratio = (float) width / height;
Matrix.frustumM(Triangle.mProjMatrix, 0, -ratio, ratio, -1, 1, 1, 10);
Matrix.setLookAtM(Triangle.mVMatrix, 0, 0,0,3,0f,0f,0f,0f,1.0f,0.0f);

這幾行代碼就構(gòu)成了一個(gè)從人眼看物體的場(chǎng)景,其中frustumM是透視投影矩陣,后續(xù)會(huì)將到
setLookAtM就是眼睛的位置后續(xù)會(huì)將到

到這里繪制三角形的關(guān)鍵點(diǎn)都介紹完了,下面直接將剩余代碼貼出來(lái)即可

三.剩余Android代碼

public class Sample3_1Activity extends Activity
{
    MyTDView mview;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //設(shè)置為豎屏模式
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        mview=new MyTDView(this);
        mview.requestFocus();
        mview.setFocusableInTouchMode(true);
        setContentView(mview);
    }
    
    @Override
    public void onResume()
    {
        super.onResume();
        mview.onResume();
    }
    
    @Override
    public void onPause()
    {
        super.onPause();
        mview.onPause();
    }
}

這里要注意點(diǎn)就是:在Activity的onResume()和onPause要將GLSurface給onResume和onPause

運(yùn)行效果為:

screenshot.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,334評(píng)論 0 17
  • 接連的兩次培訓(xùn),讓我做了足足一周的杭城人~別問(wèn)我去了哪些景點(diǎn),我!不!是!來(lái)!旅!游!的!不過(guò)面對(duì)這么一個(gè)文藝的城...
    星婷鈴兒閱讀 349評(píng)論 0 0
  • 1.字符串的旋轉(zhuǎn) 將字符串‘a(chǎn)bcdef’中頭部的‘a(chǎn)bc’移到字符串的尾部,變成‘defabc’ 用蠻力法將頭部...
    _SilverBullet閱讀 305評(píng)論 0 0
  • 沒(méi)想到簡(jiǎn)書(shū)在手機(jī)上也很方便寫(xiě)作哦。那這次住院也能寫(xiě)文章了,真好!
    蓮之翩躚閱讀 126評(píng)論 0 0

友情鏈接更多精彩內(nèi)容