在Android下的第一個OpenGL es 2.0的項目,我們從最簡單開始。使用OpenGL es改變屏幕的顏色。
雖然簡單,但是我看的了好多資料基本都沒有講這些基礎,上來就畫個三角形,搞得看完了。我發現什麼都沒有記住,到時在複製粘貼。
既然是要做最好,肯定要和別人不一樣,基礎其實很重要的。
一、創建OpenGL es項目
接下你將學習OpenGL es 2.0對Android入門,是一些比較簡單的內容,你可以很全面的瞭解OpenGL es在Android下使用。
1.檢查手機是否支持OpenGL es 2.0
- OpenGL ES 1.0和1.1 - Android 1.0及更高版本支持此API規範。
- OpenGL ES 2.0 - Android 2.2(API級別8)及更高版本支持此API規範。
- OpenGL ES 3.0 - Android 4.3(API級別18)及更高版本支持此API規範。
- OpenGL ES 3.1 - Android 5.0(API級別21)及更高版本支持此API規範。
我們學習的是OpenGL 2.0 ,可以看出OpenGL es 2.0 對Android 手機的要求,並不高。現在4.4的系統谷歌都推薦放棄了。
但是,我們寫的App都是在別人手機上,我怎麼知道,他(她)的手機支持呢?
有兩種辦法解決,這個問題。
(1)在AndroidManifest 下聲明
你需要在清單列表(AndroidManifest.xml)聲明,你需要使用OpenGL es和版本。
<uses-feature android:glEsVersion = “0x00020000” android:required = “true” />
glEsVersion = “0x00020000” : 指告訴系統這個應用程序需要OpenGL ES 2.0,0x00020000就是openGL的版本。
如果你需要OpenGL es 3.0 你只需要把 0x00020000改爲0x00030000,依次類推。
提問:你有沒有想過在AndroidManifest聲明有什麼用?
原因:
在Android中AndroidManifest是不會被反編譯的,應用市場可以直接通過分析AndroidManifest來知道。
這個App需要什麼權限,需要什麼版本的系統支持。
這裏是用來過濾不支持opneGL es 2.0的手機的,應用市場會對不支持的隱藏。(Google Play就是這樣,別的不知道)
(2)在代碼檢查
在一些特點的開發中,我們需要它安裝到設備上去,也需要知道我這個設備是否支持OpenGL es 2.0,則需要代碼檢查。
private boolean isOpenGL() {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
return false;
}
return true;
}
具體怎麼使用看開發場景了,大部分我們只需要在AndroidManifest簡單聲明一下。
因爲基本99.8%的手機都支持了。點擊可以查看Google的統計
(3)我需要使用3.0又怕不支持,怎麼辦?
還有一種情況,在不支持OpenGL es 3.0的時候使用OpenGL 2.0 。
其實谷歌也告訴我們怎麼做了。
這裏我就不講直接指向Google的資料。如果訪問不到,請自己百度,我就不費力講這裏了。
二、OpenGL es 2.0的基礎知識
準備工作,做完了,我們還需要了解基礎知識。
1.簡單說明
舉個例啊,在現實你要畫畫需要一張紙和一個筆纔可以,在Android下也是這樣。
GLSurfaceView 就是這
張紙。當然你也可以使用
TextureView、SurfaceView,但是這都是以後的事了。
Renderer :就是筆。Renderer是渲染器負責進行OpenGL調用以渲染幀。
2.具體說明
(1)GLSurfaceView
GLSurfaceView:
SurfaceView的一種實現,它使用專用表面來顯示OpenGL渲染。你需要使用它邦定Activity的生命週期,防止發生錯誤。
(2)Renderer 渲染器
GLSurfaceView.Renderer
在使用OpenGL ES的應用程序中實現類或渲染器是事情開始變得有趣的地方。此類控制GLSurfaceView
與其關聯的內容。
onSurfaceCreated()
- 調用一次以設置視圖的OpenGL ES環境。onSurfaceChanged()
- 如果視圖的幾何圖形發生更改,則調用此方法。(例如,設備的屏幕方向更改)onDrawFrame()
- 爲每次重繪視圖調用。(我們大多操作在這個方法)
注意點:
onSurfaceCreated()
這個方法不只是第一次創建纔會被調用。當你返回主頁面在進入是同樣會調用,注意使用哦!
GLSurfaceView 會在一個單獨的線程裏調用
Renderer渲染,如果需要通訊要轉到主線程。
三、簡單實戰
接下我們要進入實戰接待。當然很簡單,就當是簡單的瞭解吧!
我會把之前的步驟也演示出來,確保你得到的效果和我一致。
1. AndroidManifest.xml
對,聲明需要OpenGL es 2.0 ,還是以2.0 爲準。
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
2.MainAcitvity
我直接加載的是
GLSurfaceView,還有Shwo就是隻是簡單的工具類,在這只是個Toast。
下面會有我的項目的Demo,它在GitHub上。
private MyGLSurfaceView mMyGLSurfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMyGLSurfaceView = new MyGLSurfaceView(this);
if (isOpenGL()) {
setContentView(mMyGLSurfaceView);
} else {
Show.showToast("沒有找到OpenGL 2.0");
// 你也可以在這設置別的佈局
setContentView(R.layout.activity_demo);
}
}
private boolean isOpenGL() {
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)) {
Show.showToast("該設備不支持OpenGL es 2.0");
return false;
}
return true;
}
@Override
protected void onPause() {
super.onPause();
mMyGLSurfaceView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mMyGLSurfaceView.onResume();
}
3. MyGLSurfaceView
private MyRenderer mMyRenderer;
public MyGLSurfaceView(Context context) {
super(context);
// 創建OpenGL版本
setEGLContextClientVersion(2);
// 創建自己的渲染器
mMyRenderer = new MyRenderer();
// 設置渲染器以在GLSurfaceView上繪圖
setRenderer(mMyRenderer);
// 渲染器僅在創建曲面或requestRender()調用曲面時渲染。
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
setEGLContextClientVersion () 必須設置
setRenderMode() 通常設置兩種參數,分別是RENDERMODE_WHEN_DIRTY、RENDERMODE_CONTINUOUSLY。
RENDERMODE_WHEN_DIRTY: 連續調用渲染器以重新渲染場景。
RENDERMODE_CONTINUOUSLY:渲染器僅在創建曲面或
requestRender()
調用曲面時渲染。這裏是爲節約內存。
3.MyRenderer
這個類纔是最關鍵的,基本操作在這裏進行。
class MyRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Show.showLog("onSurfaceCreated");
// 設置清屏顏色
// 第一個參數紅色、黃色、藍色、透明度
GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
//onSurfaceChanged。surface大小改變的回調。比如橫豎屏切換
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
Show.showLog("onSurfaceChanged");
// 設置在屏幕上的繪製窗口大小。
GLES20.glViewport(0, 0, width, height);
}
//onDrawFrame。每一次繪製幀的時候調用的方法。
@Override
public void onDrawFrame(GL10 gl) {
Show.showLog("onDrawFrame");
//清屏,每次調用就會執行
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
}
簡單的功能,註釋其實已經很清楚了,你現在不要急着想知道特別清楚。這裏只是讓你大概瞭解一下OpenGL es,效果就是在手機上顯示給藍色。這個例子很簡單,我希望你能自己寫出來,並在收手機上運行出來。
這章基本把一些特別基礎的講完了,希望你有所收穫。這章的Demo對應的Demo目錄的demo下面的代碼,功能很簡單,我就不貼gitHub的地址了,等下長在貼吧!