Android OpenGL ES - 實現(xiàn)OpenGL ES接口

OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集字逗,針對手機俺驶、PDA和游戲主機等嵌入式設(shè)備而設(shè)計。
OpenGL(Open Graphics Library)是一個跨編程語言、跨平臺的3D圖形庫。廣泛應(yīng)用于游戲跳仿、娛樂、VR等領(lǐng)域.安卓系統(tǒng)中的核心庫層就有這個捐晶。
OpenGL ES是在OpenGL基礎(chǔ)上針對移動端而裁剪的 菲语。
OpenGL ES由當初的1.0、2.0發(fā)展到現(xiàn)在的3.0了惑灵。我這個系列是針對2.0的.因為3.0的只支持android 4.3以上的版本,即時是4.3以上山上,有的手機硬件也還不支持3.0 。

一英支、GLSurfaceView介紹

在Android平臺上實現(xiàn)OpenGL的view很簡單,只需要用到GLSurfaceViewGLSurfaceView.Renderer佩憾。
GLSurfaceView是用來連接OpenGL ES和android的view結(jié)構(gòu)的.GLSurfaceView位于android.opengl包類,繼承自SurfaceView

public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    ......
}

二、GLSurfaceView.Renderer介紹

Renderer也叫渲染器,是一個接口潭辈,位于GLSurfaceView類中.

public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    ......
    public interface Renderer {

        void onSurfaceCreated(GL10 gl, EGLConfig config);

        void onSurfaceChanged(GL10 gl, int width, int height);

        void onDrawFrame(GL10 gl);
    ......
    }   
}

提供了三個方法

 - onSurfaceCreated  -------- 在Surface創(chuàng)建的時候調(diào)用
 - onSurfaceChanged--------   在Surface改變的的時候調(diào)用
 - onDrawFrame  ------------- 在Surface上繪制的時候調(diào)用

三鸯屿、搭建一個最基本的框架

按照以下步驟
1.新建一個Android項目
2.新建GLSurfaceView實例
3.創(chuàng)建渲染器Renderer實例
4.給GLSurfaceView設(shè)置Renderer實例
5.顯示GLSurfaceView

一言不合貼代碼

public class MainActivity extends Activity {
    private GLSurfaceView glSurfaceView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //如果本設(shè)備支持OpenGl ES 2.0
        if (IsSupported()) {
            //新建GLSurfaceView實例
            glSurfaceView = new GLSurfaceView(this);
            // 創(chuàng)建渲染器實例
            MyRenderer mRenderer = new MyRenderer();
            // 設(shè)置渲染器
            glSurfaceView.setRenderer(mRenderer);
            //顯示SurfaceView
            setContentView(glSurfaceView);
        }
    }

IsSupported()方法的代碼如下

private boolean IsSupported() {
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000;
        return supportsEs2;
}

實際中我們以后所有的處理都實現(xiàn)在MyRenderer這個接口的實現(xiàn)類,我在這里顯示一個綠色的空白屏幕

public class MyRenderer implements GLSurfaceView.Renderer {
        // Surface創(chuàng)建的時候調(diào)用
        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // 設(shè)置清屏顏色
            gl.glClearColor(0f, 1f, 0f, 0f);
        }
        // Surface改變的的時候調(diào)用
        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // 設(shè)置窗口大小
            gl.glViewport(width / 4, width / 2, width / 2, height / 2);
        }
        // 在Surface上繪制的時候調(diào)用
        @Override
        public void onDrawFrame(GL10 gl) {
            //設(shè)置渲染模式                        
          glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
            // 清除屏幕 
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);            
        }
    }

最后為了配合Activity的生命周期,我們加上如下代碼

    @Override
    protected void onPause() {
        super.onPause();
        if (glSurfaceView != null) {
            glSurfaceView.onPause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (glSurfaceView != null) {
            glSurfaceView.onResume();
        }
    }

我詳細的介紹以下三個方法.

onSurfaceCreated

它是在Surface創(chuàng)建的時候調(diào)用,可以在這里進行一些初始化操作澈吨,它攜帶兩個參數(shù)GL10 和 EGLConfig把敢。

  • GL10 繼承自GL的一個接口,封裝了程序語言為OpenGL綁定的核心功能,我們可以把它理解為一個“畫筆”,操作它提供的的方法來在GLSurfaceView上這塊“畫布”繪制
  • EGLConfig 是一個抽象類谅辣,但是沒有任何實現(xiàn),不管它

我在這里調(diào)用gl.glClearColor(0f, 1f, 0f, 0f)設(shè)置清屏顏色為綠色,所謂清屏顏色就是當開始繪制時修赞,屏幕所顯示的顏色。glClearColor(float red, float green, float blue, float alpha)四個參數(shù)對應(yīng)紅桑阶、綠柏副、藍、透明度蚣录。這里的取值范圍是0到1f割择。不是RGB中0~255

onSurfaceChanged

它是在Surface大小改變的時候調(diào)用,這個方法只會執(zhí)行一次,Surface創(chuàng)建時初始大小為0萎河,所以需要指定窗口大小,調(diào)用glViewport(int x, int y, int width, int height)方法傳入四個參數(shù),x,y坐標和寬高荔泳。
這里要注意一點,這個窗口坐標原點是位于屏幕左下角,與android中的屏幕坐標系不一樣
Android中的屏幕坐標系如圖所示

這里寫圖片描述

OpenGl中的窗口坐標系
這里寫圖片描述

onDrawFrame

它是在Surface上繪制的時候調(diào)用。
1.通過setRenderMode設(shè)置渲染模式,有兩種供選擇

  • GLSurfaceView.RENDERMODE_CONTINUOUSLY 不間斷的繪制,默認渲染模式是這種

  • GLSurfaceView.RENDERMODE_WHEN_DIRTY 在屏幕變臟時繪制,也就是當調(diào)用GLSurfaceView的requestRender ()方法后才會執(zhí)行一次(第一次運行的時候會自動繪制一次)

2.調(diào)用glClear(GL10.GL_COLOR_BUFFER_BIT)方法清除屏幕顏色,執(zhí)行這個方法之后,屏幕就會渲染之前通過glClearColor設(shè)置的清屏顏色.如下圖所示

這里寫圖片描述

如果設(shè)置渲染模式為GLSurfaceView.RENDERMODE_CONTINUOUSLY那么onDrawFrame方法會一直執(zhí)行,看打印


這里寫圖片描述

如果想看得更直觀一點,那么打開手機開發(fā)者選項虐杯,打開顯示Surface更新,你會看到屏幕一直在閃

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玛歌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子擎椰,更是在濱河造成了極大的恐慌支子,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件达舒,死亡現(xiàn)場離奇詭異值朋,居然都是意外死亡叹侄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門吞歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圈膏,“玉大人,你說我怎么就攤上這事篙骡』ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵糯俗,是天一觀的道長尿褪。 經(jīng)常有香客問我,道長得湘,這世上最難降的妖魔是什么杖玲? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淘正,結(jié)果婚禮上摆马,老公的妹妹穿的比我還像新娘。我一直安慰自己鸿吆,他們只是感情好囤采,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惩淳,像睡著了一般蕉毯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上思犁,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天代虾,我揣著相機與錄音,去河邊找鬼激蹲。 笑死棉磨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的学辱。 我是一名探鬼主播乘瓤,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼项郊!你這毒婦竟也來了馅扣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤着降,失蹤者是張志新(化名)和其女友劉穎差油,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蓄喇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年发侵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆偏。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡刃鳄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钱骂,到底是詐尸還是另有隱情叔锐,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布见秽,位于F島的核電站愉烙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏解取。R本人自食惡果不足惜步责,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望禀苦。 院中可真熱鬧蔓肯,春花似錦、人聲如沸振乏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆码。三九已至气忠,卻和暖如春邻储,著一層夾襖步出監(jiān)牢的瞬間赋咽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工吨娜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脓匿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓宦赠,卻偏偏與公主長得像陪毡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勾扭,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容