Android OpenGL ES 讀書筆記(1)

初始化OpenGL

我們通過搭建一個簡單OpenGL的項目,然后一步步細(xì)化,了解其中的奧秘。

書籍地址PDF:OpenGL ES2.0 應(yīng)用開發(fā)實踐指南Android卷

源碼地址:https://github.com/maimingliang/OpenGLDemo

初始化GLSurfaceView

GLSurfaceView是一個視圖,繼承至SurfaceView,通過內(nèi)嵌的“surface”的特定內(nèi)存區(qū)域完成對OpenGL的渲染。

GLSurfaceView的特性:

  1. 管理一個surface,這個surface就是一塊特殊的內(nèi)存,能直接排版到android的視圖view上。
  2. 管理一個EGL display,它能讓opengl把內(nèi)容渲染到上述的surface上。
  3. 用戶自定義渲染器(render)。
  4. 讓渲染器在獨立的線程里運作,和UI線程分離。
  5. 支持按需渲染(on-demand)和連續(xù)渲染(continuous)。
  6. 一些可選工具,如調(diào)試。

創(chuàng)建GLSurfaceView實例:

 mGLSurfaceView = new GLSurfaceView(this);
 initGl(); 
 setContentView(mGLSurfaceView);

 private void initGl() { 
 
//判斷是否支持OpenGL 2.0
 if (!Utils.isSuppostEs2(this)) {
 Toast.makeText(this,"does suppost es 2.0 ",Toast.LENGTH_SHORT).show();
 return; 
 }  
 mGLSurfaceView.setEGLContextClientVersion(2);
 
 } 

判斷是否支持OpenGL 2.0

/**
*判斷是否支持OpenGL 2.0
*/
 public static boolean isSuppostEs2(Context context) {
 
 ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
 
 ConfigurationInfo deviceConfigurationInfo = activityManager.getDeviceConfigurationInfo();
 
 int version = deviceConfigurationInfo.reqGlEsVersion;
 
 if(version >= 0x20000){
 return true; 
 } 
 
 return false; 
 } 

處理一下生命周期事件

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

創(chuàng)建Renderer類

Renderer渲染器,GLSurfaceView會在一個單獨的線程調(diào)用渲染器的方法,默認(rèn)的情況下,GLSurfaceView會以顯示設(shè)備刷新頻率不斷的渲染。

Renderer是一個接口,定義了三個方法:

onSurfaceCreated:當(dāng)Surface被創(chuàng)建的時候,GLSurfaceView會調(diào)用這個方法 ,這發(fā)生在應(yīng)用程序第一次運行的時候,并且,當(dāng)設(shè)備喚醒或者用戶從其他Activity切換回來時,這個方法也可能被調(diào)用。

onSurfaceChanged:在surface創(chuàng)建以后,每次surface尺寸的變化,這個方法都會別調(diào)用。比如橫豎屏切換。

onDrawFrame:當(dāng)繪制一幀時,這個方法就會別調(diào)用,在這個方法中,我們一定要繪制點東西,即使只是清空屏幕;因為這個方法調(diào)用后,渲染緩沖區(qū)就會交換顯示到屏幕上,如果什么都沒有繪制,屏幕可能出現(xiàn)閃爍的情況。


public class MyRender implements GLSurfaceView.Renderer {
 
 
 private Context mContext;
 
 public MyRender(Context context) {
 mContext = context;
 
 } 
 
 
 @Override 
 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//設(shè)置清空屏幕用的顏色,分別對應(yīng)紅色、綠色和藍(lán)色,最后一個為透明度。
 GLES20.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
 } 
 
 @Override 
 public void onSurfaceChanged(GL10 gl, int width, int height) {
//設(shè)置了視口尺寸,告訴 OpenGL 可以用來渲染的 surface 的大小。
 GLES20.glViewport(0, 0, width, height);
 } 
 
 @Override 
 public void onDrawFrame(GL10 gl) {
 //會擦除屏幕上的所有顏色,并用 glClearColor 中的顏色填充整個屏幕。
 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
 } 
} 

Renderer與GLSurfaceView關(guān)聯(lián)

 private void initGl() { 

 if (!Utils.isSuppostEs2(this)) {
 Toast.makeText(this,"does suppost es 2.0 ",Toast.LENGTH_SHORT).show();
 return; 
 } 

 mGLSurfaceView.setEGLContextClientVersion(2);
//設(shè)置GLSurfaceView關(guān)聯(lián)的Renderer
 mGLSurfaceView.setRenderer(new AirHockeyRenderer(this));
 rendererSet = true;
 
 
 } 

將程序運行起來了,你將看到一個完全紅色的屏幕。

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,347評論 2 377

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