Saturday, March 15, 2014

OpenGL ES 2.0 trên android - Khởi tạo OpenGL ES 2.0 trên Android

Xây dựng một môi trường OpenGL ES

Để vẽ đồ họa với OpenGL ES trong ứng dụng Android của bạn, bạn phải tạo một khung nhìn cho chúng. Một trong những cách thẳng thắn để làm điều này là implements cả hai GLSurfaceView và GLSurfaceView.Renderer. Một GLSurfaceView là một khung nhìn cho đồ họa được vẽ với OpenGL và GLSurfaceView.Renderer kiểm soát những gì được vẽ ra trong khung nhìn đó. Để biết thêm thông tin về các lớp này, hãy xem hướng dẫn phát triển OpenGL ES.
GLSurfaceView chỉ là một cách để kết hợp đồ họa OpenGL ES vào ứng dụng của bạn. Cho toàn màn hình hoặc màn hình gần như đầy màn hình, đó là một lựa chọn hợp lý. Những người phát triển muốn kết hợp đồ họa OpenGL ES trong một phần nhỏ layout của họ, nên cần có một cái nhìn tại TextureView. Đối với thực tế, nếu bản thân bạn là nhà phát triển, bạn cũng có thể xây dựng một cái nhìn OpenGL ES sử dụng SurfaceView, nhưng điều này đòi hỏi phải viết khá nhiều mã bổ sung.
Bài học này giải thích làm thế nào để hoàn thành một cách đơn giản để sử dụng GLSurfaceView và GLSurfaceView.Renderer trong một hoạt động ứng dụng đơn giản.

1.1.   Tuyên bố sử dụng OpenGL ES trong Manifest

Để các ứng dụng của bạn sử dụng OpenGL ES 2.0 API, bạn phải thêm tuyên bố sau đây cho Manifest của bạn:
android:glEsVersion="0x00020000" android:required="true" />
Nếu ứng dụng của bạn sử dụng kết cấu nén, bạn cũng phải khai báo các định dạng nén bạn hỗ trợ để các thiết bị không hỗ trợ định dạng này không cố gắng để chạy ứng dụng của bạn:
 android:name="GL_OES_compressed_ETC1_RGB8_texture" />

 android:name="GL_OES_compressed_paletted_texture" />
Để biết thêm thông tin về các định dạng nén kết cấu, xem hướng dẫn phát triển OpenGL.

1.2.   Tạo ra một Activity cho đồ họa OpenGL ES

Các ứng dụng Android sử dụng OpenGL ES có hoạt động giống như bất kỳ ứng dụng khác mà có một giao diện người dùng. Sự khác biệt chính từ các ứng dụng khác là những gì bạn đặt trong layout cho Activity của bạn. Trong khi trong nhiều ứng dụng bạn có thể sử dụng TextView, Button và ListView, trong một ứng dụng có sử dụng OpenGL ES, bạn cũng có thể thêm một GLSurfaceView.

Ví dụ sau cho thấy một thực hiện tối thiểu của một hoạt động có sử dụng một GLSurfaceView như khung nhìn cơ bản của nó:
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);

    }

}
Lưu ý: OpenGL ES 2.0 yêu cầu Android 2.2 (API Level 8) hoặc cao hơn, do đó hãy chắc chắn rằng mục tiêu dự án Android của bạn là API 2.2 hoặc cao hơn.

1.3.   Xây dựng một đối tượng GLSurfaceView

Một GLSurfaceView là một khung nhìn đặc biệt mà bạn có thể vẽ đồ họa OpenGL ES. Nó không làm được gì nhiều với chính nó. Bản vẽ thực tế của đối tượng được kiểm soát trong GLSurfaceView.Renderer mà bạn thiết lập cho khung nhìn này. Trong thực tế, mã cho đối tượng này là quá mỏng, bạn có thể bị cám dỗ để bỏ qua mở rộng nó và chỉ cần tạo ra một thể GLSurfaceView chưa sửa đổi, nhưng dừng làm điều đó. Bạn cần phải mở rộng lớp này để nắm bắt sự kiện liên lạc, được bao phủ trong bài học  Responding to Touch Events.
Mã cần thiết cho một GLSurfaceView là tối thiểu, do đó để thực hiện nhanh chóng, chúng ta thường chỉ cần tạo một lớp bên trong Activity sử dụng nó:
class MyGLSurfaceView extends GLSurfaceView {



    public MyGLSurfaceView(Context context){

        super(context);



        // Set the Renderer for drawing on the GLSurfaceView

        setRenderer(new MyRenderer());

    }

}
Khi sử dụng OpenGL ES 2.0, bạn phải thêm lời gọi khác trong hàm khởi tạo của GLSurfaceView, quy định sử dụng API 2.0:
// Create an OpenGL ES 2.0 context

setEGLContextClientVersion(2);
Lưu ý: Nếu bạn đang sử dụng OpenGL ES 2.0 API, chắc chắn rằng bạn khai báo cái này trong manifest của ứng dụng của bạn. Để biết thêm thông tin, xem Khai báo sử dụng OpenGL ES trong Manifest.
Một bổ sung tuỳ chọn khác để thực hiện GLSurfaceView của bạn là để thiết lập chế độ render để chỉ vẽ lên khung nhìn khi có sự thay đổi dữ liệu bản vẽ của bạn bằng cách sử dụng thiết lập GLSurfaceView.RENDERMODE_WHEN_DIRTY:
// Render the view only when there is a change in the drawing data

setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
Thiết lập này ngăn cản khung GLSurfaceView được vẽ lại cho đến khi bạn gọi requestRender (), mà là hiệu quả hơn cho các ứng dụng mẫu này.

1.4.   Xây dựng một lớp Renderer

Việc thực hiện của lớp GLSurfaceView.Renderer, hoặc renderer, trong một ứng dụng có sử dụng OpenGL ES là nơi mà mọi thứ bắt đầu trở nên thú vị. Lớp này kiểm soát những gì được vẽ trên GLSurfaceView mà nó có liên quan. Có ba hàm trong một renderer được gọi bởi hệ thống Android để tìm ra những gì và làm thế nào để vẽ trên một GLSurfaceView:
·         onSurfaceCreated () - Được gọi là một lần để thiết lập môi trường OpenGL ES của khung nhìn.
·         onDrawFrame () - Được gọi mỗi khi vẽ lại khung nhìn.
·         onSurfaceChanged () - Được gọi là nếu khung nhìn thay đổi, ví dụ như khi của thiết bị màn hình thay đổi định hướng.
Dưới đây là một ví dụ rất cơ bản của một renderer OpenGL ES, mà không gì hơn là vẽ một nền màu xám trong 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);

    }

}
Đó là tất cả những gì phải làm! Các ví dụ trên tạo ra một ứng dụng Android đơn giản mà sẽ hiển thị một màn hình màu xám sử dụng OpenGL. Trong khi mã này không làm bất cứ điều gì rất thú vị, bằng cách tạo ra các lớp này, bạn đã đặt nền móng bạn cần để bắt đầu vẽ các yếu tố đồ họa với OpenGL.
Lưu ý: Bạn có thể tự hỏi tại sao những phương pháp này có một tham số GL10, khi bạn đang sử dụng các API OpengGL ES 2.0. Những chữ ký phương pháp chỉ đơn giản là tái sử dụng cho các API 2.0 để giữ mã framework Android đơn giản.

Nếu bạn đã quen thuộc với các API OpenGL ES, bây giờ bạn sẽ có thể thiết lập một môi trường OpenGL ES trong ứng dụng của bạn và bắt đầu vẽ đồ họa. Tuy nhiên, nếu bạn cần nhiều hơn một chút giúp đỡ bắt đầu với OpenGL, đầu vào cho các bài học tiếp theo cho một vài gợi ý hơn.

No comments:

Post a Comment