- Cung cấp code dính để kết nối OpenGL ES với hệ thống View
- Cung cấp code dính để làm OPenGL ES làm việc với chu kỳ sống Activity
- Làm dễ dàng trong việc lựa chon định dạng khung đệm pixel tương thích
- Cung công cụ debugging dễ dùng để lần theo OpenGL ES API gọi và kiểm tra lỗi.
GLSurfaceView là một nền tốt cho việc xây dựng ứng dụng mà có dùng OpenGL ES. Game hành động 2D hoặc 3D sẽ là một trường hợp đáng quan tâm nhất, và hình ảnh ứng dụng sẽ sống động hơn giốp như Google Maps StreetView.
Ứng dụng đơn giản nhất của GLSurfaceView
Đây là nguồn code cho ứng dụng đơn giản nhất của OpenGL ES:
java:
-
- package com.example.android.apis.graphics;
-
- import javax.microedition.khronos.egl.EGLConfig;
- import javax.microedition.khronos.opengles.GL10;
-
- import android.app.Activity;
- import android.opengl.GLSurfaceView;
- import android.os.Bundle;
-
- public class ClearActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mGLView = new GLSurfaceView(this);
- mGLView.setRenderer(new ClearRenderer());
- setContentView(mGLView);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mGLView.onPause();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mGLView.onResume();
- }
-
- private GLSurfaceView mGLView;
- }
-
- class ClearRenderer implements GLSurfaceView.Renderer {
- public void onSurfaceCreated(GL10 gl, EGLConfig config) {
- // Do nothing special.
- }
-
- public void onSurfaceChanged(GL10 gl, int w, int h) {
- gl.glViewport(0, 0, w, h);
- }
-
- public void onDrawFrame(GL10 gl) {
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
- }
- }
-
-
Trong chương trình này không làm nhiều: Nó xóa màn hình thành màu đen trên mỗi frame. Nhưng nó hoàn toàn là một ứng dụng OpenGL, một cách chính xác nó được hiện thực trong chu kỳ code Android Activity. Nó sẽ ngừng (pause) đưa ra khi Activity được dừng, và trở lại khi Activity được trở lại (resumed). Bạn có thể dùng ứng dụng ứng dụng này như cơ bản cho chương trình không tương tác. Chỉ cần thêm OpenGL gọi đến phương thức
java:
- ClearRenderer.onDrawFrame
Cần nhớ rằng
java:
- GLSurfaceView.Render
Phương thức
java:
- onSurfaceCreated()
java:
- OnSurfaceCreated()
Phương thức
java:
- onSurfaceChanged()
Phương thức
java:
- onDrawFrame()
java:
- glClear
User Input như thế nào?
Nếu bạn muốn tương tác với ứng dụng giống như game, bạn sẽ đặc trưng đến lớp con GLSurfaceView, bởi vì nó là một cách dễ dàng để đạt được các sự kiện vào. Đây là một ví dụ dài hơn để các bạn thấy nó làm như thế nào:
java:
-
- package com.google.android.ClearTest;
-
- import javax.microedition.khronos.egl.EGLConfig;
- import javax.microedition.khronos.opengles.GL10;
-
- import android.app.Activity;
- import android.content.Context;
- import android.opengl.GLSurfaceView;
- import android.os.Bundle;
- import android.view.MotionEvent;
-
- public class ClearActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mGLView = new ClearGLSurfaceView(this);
- setContentView(mGLView);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mGLView.onPause();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mGLView.onResume();
- }
-
- private GLSurfaceView mGLView;
- }
-
- class ClearGLSurfaceView extends GLSurfaceView {
- public ClearGLSurfaceView(Context context) {
- super(context);
- mRenderer = new ClearRenderer();
- setRenderer(mRenderer);
- }
-
- public boolean onTouchEvent(final MotionEvent event) {
- queueEvent(new Runnable(){
- public void run() {
- mRenderer.setColor(event.getX() / getWidth(),
- event.getY() / getHeight(), 1.0f);
- }});
- return true;
- }
-
- ClearRenderer mRenderer;
- }
-
- class ClearRenderer implements GLSurfaceView.Renderer {
- public void onSurfaceCreated(GL10 gl, EGLConfig config) {
- // Do nothing special.
- }
-
- public void onSurfaceChanged(GL10 gl, int w, int h) {
- gl.glViewport(0, 0, w, h);
- }
-
- public void onDrawFrame(GL10 gl) {
- gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
- gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
- }
-
- public void setColor(float r, float g, float b) {
- mRed = r;
- mGreen = g;
- mBlue = b;
- }
-
- private float mRed;
- private float mGreen;
- private float mBlue;
- }
-
-
Ứng dụng xóa màn hình mỗi frame. Chương trình này sẽ xóa màu sắc dựa trên tọa độ của sự kiện touch. Chú ý cách dùng của queueEvent() trong ClearGLSurfaceView.onTouchEvetn(). Phương thức queueEvent() là được dùng an toàn giữa giao tiếp UI thread và rendering thread. Nếu bạn thích bạn có thể dùng một vài kỹ thuật giao tiếp khác của java, như là phương thức đồng bộ trên lớp Render. Nhưng hàng đợi sự kiện là thường là cách đơn giản nhất.
Ứng dụng khác của GLSurfaceView
Bạn có thấy việc xóa màn hình có vất vả không? Bạn có thể tìm nhiều ví dụ hập dẫn trong API Demos của SDK. Tất cả ví dụ OpengGL ES đã được chuyển sang dùng GLSurfaceView view.
- GLSurfaceView - xoay tam giác
- Kube - Demo một khối puzzle
- Translucent GLSurfaceView - làm thể nào để hiện đồ họa 3D trên nền mờ
- Textured Triangle
- Sprite Text -
- Touch Rotate
Lựa chọn một Surface
GLSurfaceView giúp bạn chọn loại surface để render. Các loại thiết bị Android khác nhau sẽ hỗ trợ loại surface khác nhau, sẽ không cùng chung tập hợp. Điều này là một vấn đề nghiêm ngặc trong việc chọn surface tốt nhất cho mỗi thiết bị. Về mặc định GLSurfaceView cố gắng lựa chọn surface mà nó gần nhất có thể để một 16-bit RGB frame buffer với một 16-bit buffer sâu. Dựa trên ứng dụng bạn có thể thay đổi. Ví dụ, trong Translslucent GLSurfaceView cần một kênh Alpha thứ tự để render dữ liệu mờ. GLSurfaceView cung cấp một phương thức setGLSurfaceChooser() để cho người phát triển điều khiển toàn bộ surface được chọn:
Quote:
Trích từ Android blog setEGLConfigChooser(boolean needDepth) Choose a config that's closest to R5G6B5 with or without a 16-bit framebuffer setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize) Choose the config with the fewest number of bits per pixel that has at least as many bits-per-channel as specified in the constructor. setEGLConfigChooser(EGLConfigChooser configChooser) Allow total control over choosing a configuration. You pass in your own implementation of EGLConfigChooser, which gets to inspect the device's capabilities and choose a configuration. |
Phần lớn ứng dụng 3D, như game or sự giả lập, là liên tục với sự sống động. Nhưng một vài ứng dụng 3D là có nhiều hành động lặp lại. Cho tất cả các loại của ứng dụng, mặc định GLSurfaceView tiếp tục vẽ lại màn hình đó là sự lãng phí thời gian. Nếu bạn đang phát triển một ứng dụng có các hoạt động lặp lại phương thức GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY), tắt sự tiếp tục sóng động. Khi đó bạn gọi GLSurfaceView.requestRender() khi bạn muốn re-render.
Giúp đỡ với việc debugging
GLSurfaceView có nắm giữ một đặc tính built-in cho việc debugging ứng dụng OpenGL ES: phương thức GLSurfaceView.setDebugFlags() có thể được dùng để logging và/hoặc kiểm tra lỗi trên OpenGL ES gọi. Gọi phương thức này trong việc xây dựng GLSurfaceView's của bạn trước khi gọi setRender:
java:
-
- public ClearGLSurfaceView(Context context) {
- super(context);
- // Turn on error-checking and logging
- setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
- mRenderer = new ClearRenderer();
- setRenderer(mRenderer);
- }
-
-
Nguồn Android blog
Không có nhận xét nào:
Đăng nhận xét