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:
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