-2

Sử dụng OpenGL trong android phần 1

**Tổng Quan Về OpenGL: **

OpenGL - Open Graphics Library Là Một Tiêu Chuẩn Kỹ Thuật Đồ Họa Có Mục Đích Định Ra Một Giao Diện Lập Trình Ứng Dụng API Đồ Họa 3 Chiều. OpenGL Cũng Có Thể Được Dùng Trong Các Ứng Dụng Đồ Họa 2 Chiều.

Giao Diện Lập Trình Này Chứa Khoảng 250 Hàm Để Vẽ Các Cảnh Phức Tạp Từ Những Hàm Đơn Giản. Nó Được Dùng Rộng Rãi Trong Các Trò Chơi Điện Tử. Ngoài Ra Nó Còn Dùng Trong Các Ứng Dụng CAD, Thực Tế Ảo, Mô Phỏng Khoa Học, Mô Phỏng Thông Tin, Phát Triển Trò Chơi.

**OpenGL Trong Android: **

  • Yêu Cầu :

    -Android Studio Và Android NDK -Emulator Có Hỗ Trợ Sử Dụng OpenGL ES 2.0.

  • Khởi Tạo OpenGL:

Đầu Tiên Chúng Ta Cần Chỉnh Sửa Và Cấu Hình Lại Cho Activity Để Khởi Tạo Opengl. Chúng Ta Sẽ Add 2 Giá Trị Này Vào Đầu Của Lớp Activity:

Private GLSurfaceView GlSurfaceView;

Private Boolean RendererSet;

Bây giờ chúng ta sẽ cài đặt pần thân của onCreate() như sau:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActivityManager activityManager
        = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();

    final boolean supportsEs2 =
        configurationInfo.reqGlEsVersion >= 0x20000 || isProbablyEmulator();

    if (supportsEs2) {
        glSurfaceView = new GLSurfaceView(this);

        if (isProbablyEmulator()) {
            // Avoids crashes on startup with some emulator images.
            glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        }

        glSurfaceView.setEGLContextClientVersion(2);
        glSurfaceView.setRenderer(new RendererWrapper());
        rendererSet = true;
        setContentView(glSurfaceView);
    } else {
        // Should never be seen in production, since the manifest filters
        // unsupported devices.
        Toast.makeText(this, "This device does not support OpenGL ES 2.0.",
                Toast.LENGTH_LONG).show();
        return;
    }
}

Đầu tiên chúng ta kiểm tra xem máy có hỗ trợ OpenGl hay không:

configurationInfo.reqGlEsVersion >= 0x20000 không hoạt động trên emulator, vì vậy chúng ta phải gọi isProbablyEmulator() để chạy trên emulator. Định nghĩa như bên dưới:

private boolean isProbablyEmulator() {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1
            && (Build.FINGERPRINT.startsWith("generic")
                    || Build.FINGERPRINT.startsWith("unknown")
                    || Build.MODEL.contains("google_sdk")
                    || Build.MODEL.contains("Emulator")
                    || Build.MODEL.contains("Android SDK built for x86"));
}

OpenGL ES 2.0 sẽ chỉ làm việc trên emulator nếu được cấu hình GPU.

Để hoàn thành khởi tạo opengl trong activity chúng ta cần add thêm các phương thức :

@Override
protected void onPause() {
    super.onPause();

    if (rendererSet) {
        glSurfaceView.onPause();
    }
}

@Override
protected void onResume() {
    super.onResume();

    if (rendererSet) {
        glSurfaceView.onResume();
    }
}

Chúng ta cần phải xử lý vòng đời Android, vì vậy chúng ta cũng tạm dừng hoặc tiếp tục GLSurfaceView khi cần thiết. Chúng ta chỉ làm điều này nếu chúng ta cũng đã gọi glSurfaceView.setRenderer(); nếu không, gọi phương pháp này sẽ gây ra những lỗi ứng dụng.

Thêm một renderer mặc định

Tạo một lớp mới gọi là RendererWrapper, và thêm đoạn mã sau:

public class RendererWrapper implements Renderer {
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // No-op
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        glClear(GL_COLOR_BUFFER_BIT);
    }
}

Renderer đơn giản này sẽ thiết lập màu sắc rõ ràng với màu xanh và xóa màn hình trên mỗi frame. Sau đó, chúng tôi sẽ thay đổi những phương pháp để gọi vào mã nguồn gốc. Để gọi các phương pháp như glClearColor () mà không có tiền tố họ với GLES20, thêm import static android.opengl.GLES20.*;

Nếu bạn có bất kỳ vấn đề trong việc có được mã để biên dịch, đảm bảo rằng bạn đã thêm tất cả các thư viện sau đây trong RendererWrapper:

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;

Cấu hình manifest loại trừ những máy ko hỗ trợ

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

từ khi openGles 2.0 ra đời thì nó chỉ hỗ trợ cho phiên bản android Gingerbread 2.3.3 trở lên, thay thế tag <uses-sdk /> theo:

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="17" />

Bài viết tham khảo: opengl getting started


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.