OpenGl ES 2.0 Learn For Android

OpenGl ES 2.0 Learn For Android

Write in the first:

工作了兩年之后单旁,很有幸的,我能接觸到gl的學習機會臣镣。事實上盼理,工作過程中谈山,學習的機會并沒有想象中的那么多,大家都在拼命地忙于業(yè)務(wù)宏怔,忙于老板的需求奏路。所以我還是很珍惜這次機會。

處于Android平臺的兼容考慮臊诊,學習時接觸的都是OpenGl ES 2.0的接口鸽粉。其實最新的版本已經(jīng)到了4.6,也有著相當多的新的特性妨猩。但鑒于我是剛接觸這個潜叛,我覺得2.0已經(jīng)很夠我學了。之后有可能會介紹新特性壶硅,但短時間內(nèi)應(yīng)該沒有相關(guān)的計劃。

現(xiàn)在的工作時長很長销斟,所以我暫時也不知道能夠把這個系列寫完庐椒。嗯,希望我能夠堅持寫完蚂踊。

學習過程中约谈,主要的知識來源:
《OpenGL ES應(yīng)用開發(fā)實踐指南:Android卷》 劉力平,蘇統(tǒng)華譯犁钟。這個已經(jīng)不在印刷了棱诱,我買的影印版,還花了正版一樣的錢涝动。迈勋。。對不起作者了醋粟。
https://github.com/markusfisch/ShaderEditor靡菇。一個德國程序員的項目,收益良多米愿。
那么厦凤,這個系列的內(nèi)容排版,也會以《OpenGL ES應(yīng)用開發(fā)實踐指南:Android卷》為準育苟,因為我本身的學習過程也是這個樣子较鼓。所以大家可以對照著書看,把我這里的內(nèi)容當做一個蹩腳學習者的筆記作為補充违柏。

1. Hello world Demo

開始的第一篇博烂,先寫一個類似于hello world的demo香椎。

我們打開布局文件activity_main,把原先的TextView改成GLSurfaceView脖母。

把MainActivity改造成下面這個樣子:

public class MainActivity extends AppCompatActivity {

    GLSurfaceView mGlSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mGlSurfaceView = findViewById(R.id.surfaceview);
        // Request an OpenGL ES 2.0 compatible context.
        mGlSurfaceView.setEGLContextClientVersion(2);
        mGlSurfaceView.setRenderer(new FirstRenderer());
    }
}

這個FirstRenderer實現(xiàn)方式如下:

public class FirstRenderer implements GLSurfaceView.Renderer {

    private static final String TAG = "FirstRenderer";

    @Override
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
        glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT);
    }

    @Override
    public void onSurfaceChanged(GL10 glUnused, int width, int height) {
        glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 glUnused) {

    }

}

效果大概是下面這個樣子士鸥。

First效果

當然,這是打開的樣子谆级。如果息屏一次烤礁,那么整個屏幕就變成了黑的。變黑的原因等會說肥照。這里我們用到了GLSurfaceView脚仔。先介紹GLSurfaceVeiw。

2.GLSurfaceVeiw

GLSurfaceView從Android 1.5(API level 3)開始加入舆绎,繼承自SurfaceView鲤脏,實現(xiàn)了SurfaceHolder.Callback2接口,擁有SurfaceView的全部特性吕朵,也有view所有的功能和屬性猎醇,特別是處理事件的能力,它主要是在SurfaceView的基礎(chǔ)上它加入了EGL的管理努溃,并自帶了一個GLThread繪制線程(EGLContext創(chuàng)建GL環(huán)境所在線程即為GL線程)硫嘶,繪制的工作直接通過OpenGL在繪制線程進行,不會阻塞主線程梧税,繪制的結(jié)果輸出到SurfaceView所提供的Surface上沦疾,這使得GLSurfaceView也擁有了OpenGlES所提供的圖形處理能力,通過它定義的Render接口第队,使更改具體的Render的行為非常靈活性哮塞,只需要將實現(xiàn)了渲染函數(shù)的Renderer的實現(xiàn)類設(shè)置給GLSurfaceView即可。

GLSurfaceView提供了下列特性:

  • 1> 提供并且管理一個獨立的Surface凳谦。
  • 2> 提供并且管理一個EGL display忆畅,它能讓opengl把內(nèi)容渲染到上述的Surface上。
  • 3> 支持用戶自定義渲染器(Render)晾蜘,通過setRenderer設(shè)置一個自定義的Renderer邻眷。
  • 4> 讓渲染器在獨立的GLThread線程里運作,和UI線程分離剔交。
  • 5> 支持按需渲染(on-demand)和連續(xù)渲染(continuous)兩種模式肆饶。
  • 6> GPU加速:GLSurfaceView的效率是SurfaceView的30倍以上,View的繪制onDraw(Canvas canvas)使用Skia渲染引擎渲染岖常,而GLSurfaceView的渲染器Renderer的onDrawFrame(GL10 gl)使用opengl繪制引擎進行渲染驯镊。,GLSurfaceView利用GPU加速提高了繪制效率。
  • 7>View的繪制onDraw(Canvas canvas)使用Skia渲染引擎渲染板惑,而GLSurfaceView的渲染器Renderer的onDrawFrame(GL10 gl)使用opengl繪制引擎進行渲染橄镜。

作者:TuGeLe
來源:CSDN
原文:https://blog.csdn.net/TuGeLe/article/details/79199161

3.OpenGL ES接口介紹###

在這個Demo中,關(guān)于GLSurface用到了兩個方法冯乘,

一個是setEGLContextClientVersion洽胶,很明顯,這里我們用它講我們使用的OpenGL ES版本固定為2.0裆馒。

另一個是setRenderer姊氓。這個接口有三個方法讓我們實現(xiàn):

  • onSurfaceCreated。surface創(chuàng)建成功的回調(diào)喷好。
  • onSurfaceChanged翔横。surface大小改變的回調(diào)。
  • onDrawFrame梗搅。每一次繪制幀的時候調(diào)用的方法禾唁。

對應(yīng)的,

  • glClearColor无切。設(shè)置清屏顏色荡短。
  • glViewport。設(shè)置在屏幕上的繪制窗口哆键。
  • glClear肢预。繪制清屏顏色。

與原文第一章不同的是洼哎,我把glClear方法移到了onSurfaceCreated。導致手機屏幕息屏沼本,再點亮重繪的話噩峦。因為繪制方法里面什么都沒有做,屏幕上顯示一片黑色抽兆。

Demo 地址:
https://github.com/YueZhiFengMing/LearnOpenGl/tree/master/FirstOpenGl

參考資料###

  1. Android GLSurfaceView詳解
  2. 《OpenGL ES應(yīng)用開發(fā)實踐指南:Android卷》
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末识补,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辫红,更是在濱河造成了極大的恐慌凭涂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贴妻,死亡現(xiàn)場離奇詭異切油,居然都是意外死亡,警方通過查閱死者的電腦和手機名惩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門澎胡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事攻谁≈晌椋” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵戚宦,是天一觀的道長个曙。 經(jīng)常有香客問我,道長受楼,這世上最難降的妖魔是什么垦搬? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮那槽,結(jié)果婚禮上悼沿,老公的妹妹穿的比我還像新娘。我一直安慰自己骚灸,他們只是感情好糟趾,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甚牲,像睡著了一般义郑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丈钙,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天衷敌,我揣著相機與錄音,去河邊找鬼琴许。 笑死趣钱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的星岗。 我是一名探鬼主播填大,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼俏橘!你這毒婦竟也來了允华?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤寥掐,失蹤者是張志新(化名)和其女友劉穎靴寂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體召耘,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡百炬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怎茫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片收壕。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妓灌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜜宪,到底是詐尸還是另有隱情虫埂,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布圃验,位于F島的核電站掉伏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澳窑。R本人自食惡果不足惜斧散,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摊聋。 院中可真熱鬧鸡捐,春花似錦、人聲如沸麻裁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煎源。三九已至色迂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間手销,已是汗流浹背歇僧。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锋拖,地道東北人诈悍。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像兽埃,于是被迫代替她去往敵國和親写隶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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

  • 本文首發(fā)于個人博客:Lam's Blog - 【OpenGL ES】入門及繪制一個三角形讲仰,文章由MarkDown語...
    格子林ll閱讀 7,265評論 2 18
  • 官方文檔地址 Android包含Open Graphics Library(OpenGL?)庫,特別是OpenGL...
    sjj_dot閱讀 2,732評論 0 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,098評論 25 707
  • 用兩張圖告訴你痪蝇,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料鄙陡? 從這篇文章中你...
    hw1212閱讀 12,723評論 2 59
  • 今天五分鐘讀了個故事。有一天躏啰,皇帝覺得趁矾,自己只要得到了三個問題的答案,做事就不會再有任何差錯啦 這三個問題分別是给僵,...
    Simin_閱讀 184評論 5 0