Android OpenGL ES2.0編程教程系列之創建OpenGL ES環境(一)


原文鏈接

為了用OpenGL在你的Android應用上繪制圖形,你必須為它們創建一個視圖容器。創建視圖容器更直接的方式之一是繼承GLSurfaceView 和 GLSurfaceView.Renderer。GLSurfaceView 是一個用OpenGL做圖形繪制的視圖容器,GLSurfaceView.Renderer用來控制在視圖畫什么。想了解更多關於這些類的信息,請看OpenGL開發者指導

GLSurfaceView 只是把OpenGL圖形合到你應用程序中的一種方式。想要全屏或近似全屏的圖形視圖,GLSurfaceView 是一個合理的選擇。開發者如果想把OpenGL圖形合到他們布局的某一小部分布局中,那么應該去看看OpenGL圖形合到TextureView。對於真的想自己做的開發者們,用SurfaceView實現OpenGL ES視圖也是可以的,只不過這需要寫一點額外的代碼。

本文解釋了怎樣在一個簡單的應用Activity中完成GLSurfaceView 和 GLSurfaceView.Renderer的極簡實現。

在注冊文件中聲明OpenGL ES使用

為了能夠在你的應用中使用OpenGL ES 2.0 API,你必須在你的注冊文件中添加如下聲明:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />
如果你的應用使用紋理壓縮,那么你也必須聲明你的應用支持那種格式的壓縮,以便於它只會被安裝在兼容的設備上。
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
如果想了解更多關於紋理壓縮格式的信息,請看OpenGL開發文檔。

為OpenGL ES圖形創建Activity

就像其他的應用程序有用戶界面一樣,使用OpenGL ES的Android應用也有Activities。與其他應用最主要的不同是你為你的Activity添加什么樣的布局。在許多應用中你或許使用TextView, Button 或 ListView,而在使用OpenGL的應用中你還可以添加一個GLSurfaceView 。

下面的代碼展示了一個使用GLSurfaceView 作為主視圖的一個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);
}
}

注意:OpenGL ES 2.0需要Android2.2(API 版本為8)或更高的版本,因此請確保你的Android工程的目標版本要為Android2.2以上版本。

建立一個GLSurfaceView對象

GLSurfaceView 是一個專門的可以在上面繪制OpenGL ES圖形的view。它自己不會做太多的事情。真正的繪制工作是你給這個view設置的GLSurfaceView.Renderer中控制的。這個對象的代碼如此的簡短、以至於你可能不去繼承它而自己創造一個沒有修改的GLSurfaceView 的實例,但是不要這么做。為了捕捉觸摸事件,你需要繼承它,這將會在響應觸摸事件的一節中講到。

繼承GLSurfaceView的基本代碼是極簡的,因此對於這樣一個快速實現,它通常是在Activity中作為一個內部類來創建。用法如下:

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實現的可選添加項是:設置只有在繪圖數據改變的時候才去繪制view的渲染模式。使用GLSurfaceView.RENDERMODE_WHEN_DIRTY 來設置:

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
這個設置會防止 GLSurfaceView的幀被重繪直到你調用requestRender(),對於一個簡單的APP這樣會更高效。
建立一個Render Class

在一個使用OpenGL ES的應用中實現GLSurfaceView.Renderer類或渲染器,事情將開始變得有趣。這個類將控制用它關聯的內容在GLSurfaceView上繪制什么。渲染器中有三個被Android系統調用的用來計算在GLSurfaceView上畫什么以及怎么畫的方法。

  • onSurfaceCreated(),調用一次用來設置view的OpenGL ES環境;
  • onDrawFrame(),調用用來重繪view;
  • onSurfaceChanged(),當view的幾何改變時調用,比如當設備屏幕的方向發生改變時;
這里有一個非常基礎的OpenGL ES渲染器的實現,它除了在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);
}
}
這就是所有的了!上面的例程代碼創建了一個用OpenGL顯示一個黑色屏幕的簡單Android應用。只創建這些類,僅僅這些代碼不能做任何非常有趣的事情。你需要奠定基礎去開始用OpenGL繪制圖形元素。

注意:也許你會感到奇怪,為什么你用OpenGLES 2.0 APIs時它們會有GL10的參數。這是為了保持Android框架層代碼更簡潔,簡單地復用了這些方法簽名。

如果你已經熟悉了OpenGL ES的APIs,你應該馬上在你的Android應用中創建OpenGL ES環境,並且開始繪制圖形。然而如果你需要更多的幫助去開始OpenGL,請繼續下一節的內容來獲取更多的提示。


例程代碼下載



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com