W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
編寫:jdneo - 原文:http://developer.android.com/training/graphics/opengl/environment.html
要在應用中使用OpenGL ES繪制圖像,我們必須為它們創(chuàng)建一個View容器。一種比較直接的方法是實現(xiàn)GLSurfaceView類和GLSurfaceView.Renderer類。其中,GLSurfaceView是一個View容器,它用來存放使用OpenGL繪制的圖形,而GLSurfaceView.Renderer則用來控制在該View中繪制的內容。關于這兩個類的更多信息,你可以閱讀:OpenGL ES開發(fā)手冊。
使用GLSurfaceView是一種將OpenGL ES集成到應用中的方法之一。對于一個全屏的或者接近全屏的圖形View,使用它是一個理想的選擇。開發(fā)者如果希望把OpenGL ES的圖形集成在布局的一小部分里面,那么可以考慮使用TextureView。對于喜歡自己動手實現(xiàn)的開發(fā)者來說,還可以通過使用SurfaceView搭建一個OpenGL ES View,但這將需要編寫更多的代碼。
在這節(jié)課中,我們將展示如何在一個的Activity中完成GLSurfaceView和GLSurfaceView.Renderer的最簡單的實現(xiàn)。
為了讓應用能夠使用OpenGL ES 2.0接口,我們必須將下列聲明添加到Manifest配置文件當中:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
如果我們的應用使用紋理壓縮(Texture Compression),那么我們必須對支持的壓縮格式也進行聲明,確保應用僅安裝在可以兼容的設備上:
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
更多關于紋理壓縮的內容,可以閱讀:OpenGL開發(fā)手冊。
使用OpenGL ES的安卓應用就像其它類型的應用一樣有自己的用戶接口,即也擁有多個Activity。主要的區(qū)別體現(xiàn)在Acitivity布局內容上的差異。在許多應用中你可能會使用TextView,Button和ListView等,而在使用OpenGL ES的應用中,我們還可以添加一個GLSurfaceView。
下面的代碼展示了一個使用GLSurfaceView作為其主View的Activity:
public class OpenGLES20Activity extends Activity {
private GLSurfaceView mGLView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a GLSurfaceView instance and set it
// as the ContentView for this Activity.
mGLView = new MyGLSurfaceView(this);
setContentView(mGLView);
}
}
Note:OpenGL ES 2.0需要Android 2.2(API Level 8)或更高版本的系統(tǒng),所以確保你的Android項目的API版本滿足該要求。
GLSurfaceView是一種比較特殊的View,我們可以在該View中繪制OpenGL ES圖形,不過它自己并不做太多和繪制圖形相關的任務。繪制對象的任務是由你在該View中配置的GLSurfaceView.Renderer所控制的。事實上,這個對象的代碼非常簡短,你可能會希望不要繼承它,直接創(chuàng)建一個未經(jīng)修改的GLSurfaceView實例,不過請不要這么做,因為我們需要繼承該類來捕捉觸控事件,這方面知識會在響應觸摸事件(該系列課程的最后一節(jié)課)中做進一步的介紹。
GLSurfaceView的核心代碼非常簡短,所以對于一個快速的實現(xiàn)而言,我們通??梢栽贏citvity中創(chuàng)建一個內部類并使用它:
class MyGLSurfaceView extends GLSurfaceView {
private final MyGLRenderer mRenderer;
public MyGLSurfaceView(Context context){
super(context);
// Create an OpenGL ES 2.0 context
setEGLContextClientVersion(2);
mRenderer = new MyGLRenderer();
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(mRenderer);
}
}
另一個對于GLSurfaceView實現(xiàn)的可選選項,是將渲染模式設置為:GLSurfaceView.RENDERMODE_WHEN_DIRTY,其含義是:僅在你的繪制數(shù)據(jù)發(fā)生變化時才在視圖中進行繪制操作:
// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
如果選用這一配置選項,那么除非調用了requestRender(),否則GLSurfaceView不會被重新繪制,這樣做可以讓應用的性能及效率得到提高。
在一個使用OpenGL ES的應用中,一個GLSurfaceView.Renderer類的實現(xiàn)(或者我們將其稱之為渲染器),正是事情變得有趣的地方。該類會控制和其相關聯(lián)的GLSurfaceView,具體而言,它會控制在GLSurfaceView上繪制的內容。在渲染器中,一共有三個方法會被Android系統(tǒng)調用,以此來明確要在GLSurfaceView上繪制的內容以及如何繪制:
下面是一個非?;镜腛penGL ES渲染器的實現(xiàn),它僅僅在GLSurfaceView中畫一個黑色的背景:
public class MyGLRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}
public void onDrawFrame(GL10 unused) {
// Redraw background color
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
}
public void onSurfaceChanged(GL10 unused, int width, int height) {
GLES20.glViewport(0, 0, width, height);
}
}
就是這樣!上面的代碼創(chuàng)建了一個簡單地應用程序,它使用OpenGL讓屏幕呈現(xiàn)為黑色。雖然它的代碼看上去并沒有做什么非常有意思的事情,但是通過創(chuàng)建這些類,我們已經(jīng)對使用OpenGL繪制圖形有了基本的認識和鋪墊。
Note:你可能想知道,自己明明使用的是OpenGL ES 2.0接口,為什么這些方法會有一個GL10的參數(shù)。這是因為這些方法的簽名(Method Signature)在2.0接口中被簡單地重用了,以此來保持Android框架的代碼盡量簡單。
如果你對OpenGL ES接口很熟悉,那么你現(xiàn)在就可以在你的應用中構建一個OpenGL ES的環(huán)境并繪制圖形了。當然, 如果你希望獲取更多的幫助來學會使用OpenGL,那么請繼續(xù)學習下一節(jié)課程獲取更多的知識。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: