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) {
}
}
效果大概是下面這個樣子士鸥。
當然,這是打開的樣子谆级。如果息屏一次烤礁,那么整個屏幕就變成了黑的。變黑的原因等會說肥照。這里我們用到了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
參考資料###
- Android GLSurfaceView詳解
- 《OpenGL ES應(yīng)用開發(fā)實踐指南:Android卷》