Home

Thứ Ba, 12 tháng 1, 2010

Giới thiệu GLSurfaceView

GLSurfaceView là một lớp API mới trong Android 1.5. GLSurfaceView làm các ứng dụng OpenGL ES dễ dàng để viết bởi vì:
  • 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:

  1. package com.example.android.apis.graphics;

  2. import javax.microedition.khronos.egl.EGLConfig;
  3. import javax.microedition.khronos.opengles.GL10;

  4. import android.app.Activity;
  5. import android.opengl.GLSurfaceView;
  6. import android.os.Bundle;

  7. public class ClearActivity extends Activity {
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. mGLView = new GLSurfaceView(this);
  12. mGLView.setRenderer(new ClearRenderer());
  13. setContentView(mGLView);
  14. }

  15. @Override
  16. protected void onPause() {
  17. super.onPause();
  18. mGLView.onPause();
  19. }

  20. @Override
  21. protected void onResume() {
  22. super.onResume();
  23. mGLView.onResume();
  24. }

  25. private GLSurfaceView mGLView;
  26. }

  27. class ClearRenderer implements GLSurfaceView.Renderer {
  28. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  29. // Do nothing special.
  30. }

  31. public void onSurfaceChanged(GL10 gl, int w, int h) {
  32. gl.glViewport(0, 0, w, h);
  33. }

  34. public void onDrawFrame(GL10 gl) {
  35. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  36. }
  37. }




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:
  1. ClearRenderer.onDrawFrame
.

Cần nhớ rằng
java:
interface có ba phương thức:

Phương thức
java:
được gọi để bắt đầu rendering, và bất cứ khi nào OpenGL ES đang vẽ ngữ cảnh (drawing context) phải khởi tạo lại. (Việc vẽ ngữ cảnh là thường mất và khở tạo lại khi Activity paused và re sumed).
java:
là một nơi tốt để tạo ra tài nguyên OpenGL giống kết cấu.

Phương thức
java:
được gọi khi bở mặt thay đổi kích thước. Nó là một nơi tốt để thiết lập Viewport OpenGL của bạn. Bạn có thể cũng thiết lập camera ở đây, nếu nó là cố định camera thì sẽ không di chuyển xung quanh khung cảnh.

Phương thức
java:
được gọi ở mỗi frame, và có trách nhiệm cho việc vẽ quang cảnh. Bạn sẽ bắt đầu gọi
java:
để xóa framebuffer, được theo ở OpenGL ES khác gọi để vẽ quang cảnh hiện tại

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:

  1. package com.google.android.ClearTest;

  2. import javax.microedition.khronos.egl.EGLConfig;
  3. import javax.microedition.khronos.opengles.GL10;

  4. import android.app.Activity;
  5. import android.content.Context;
  6. import android.opengl.GLSurfaceView;
  7. import android.os.Bundle;
  8. import android.view.MotionEvent;

  9. public class ClearActivity extends Activity {
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. mGLView = new ClearGLSurfaceView(this);
  14. setContentView(mGLView);
  15. }

  16. @Override
  17. protected void onPause() {
  18. super.onPause();
  19. mGLView.onPause();
  20. }

  21. @Override
  22. protected void onResume() {
  23. super.onResume();
  24. mGLView.onResume();
  25. }

  26. private GLSurfaceView mGLView;
  27. }

  28. class ClearGLSurfaceView extends GLSurfaceView {
  29. public ClearGLSurfaceView(Context context) {
  30. super(context);
  31. mRenderer = new ClearRenderer();
  32. setRenderer(mRenderer);
  33. }

  34. public boolean onTouchEvent(final MotionEvent event) {
  35. queueEvent(new Runnable(){
  36. public void run() {
  37. mRenderer.setColor(event.getX() / getWidth(),
  38. event.getY() / getHeight(), 1.0f);
  39. }});
  40. return true;
  41. }

  42. ClearRenderer mRenderer;
  43. }

  44. class ClearRenderer implements GLSurfaceView.Renderer {
  45. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  46. // Do nothing special.
  47. }

  48. public void onSurfaceChanged(GL10 gl, int w, int h) {
  49. gl.glViewport(0, 0, w, h);
  50. }

  51. public void onDrawFrame(GL10 gl) {
  52. gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
  53. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  54. }

  55. public void setColor(float r, float g, float b) {
  56. mRed = r;
  57. mGreen = g;
  58. mBlue = b;
  59. }

  60. private float mRed;
  61. private float mGreen;
  62. private float mBlue;
  63. }




Ứ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.
Tiếp tục với Rendering so với Render khi bẩn
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:

  1. public ClearGLSurfaceView(Context context) {
  2. super(context);
  3. // Turn on error-checking and logging
  4. setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
  5. mRenderer = new ClearRenderer();
  6. setRenderer(mRenderer);
  7. }




Nguồn Android blog

Không có nhận xét nào:

Đăng nhận xét