Bài đăng phổ biến

Thứ Hai, 22 tháng 10, 2012

EGL API Trong OpenGL ES 2.x

EGL APIs
·        KHRONOS EGL API
Đây là 1 bài viết nhỏ để hỗ trợ cho bài OpenGL ES 2.X, trong bài viết này tôi sẽ nói về API EGL. Chúng ta sẽ xem làm thế nào để cài đặt một ứng dụng của OpengGL để giao tiếp với windows System của thiết bị.
·        TỔNG QUÁT
Như tôi đã nói về phần đầu của bài hướng dẫn về OpenGL ES 2.X, Opengl thì không chịu trách nhiệm quản lý Windows System của mỗi thiết bị mà hỗ trợ nó. Opengl từ bỏ trách nhiệm này. Vì vậy nó là cầu nối giữa đầu ra của Opengl và màn hình thiết bị. Khronos đã tạo ra EGL API.

Hãy nhớ rằng EGL có thể thay đổi bởi nhà cung cấp để phù hợp với những gì cần thiết để đến với thiết bị và Window system.
·        SETUP EGL API
OK! Bây giờ chúng ta đi vào phần cài đặt của EGL việc cài đặt này là độc lập của nhà cung cấp.
Việc đầu tiên mà chúng ta cần để biết là nơi mà chúng ta muốn hiển thị nội dung của chúng ta. Thông thường nó được thực hiện với hàm eglGetDisplay, cái này sẽ trả về 1 kiểu EGLDisplay Data. Một hằng EGL_DEFAULT_DISPLAY thì luôn luôn được cài đặt bởi nhà cung cấp để trả về hiển thị mặc định của chúng. Ngay sau khi bạn gọi eglInitialize để khởi tạo EGL API. Thì hàm này sẽ trả về 1 kiểu dữ liệu Boolean để thông báo trạng thái. Vì vậy bình thường bạn bắt đầu code như sau:
1
2
3
4
5
6
7
8
EGLDisplay display;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

if (eglInitialize(display, NULL, NULL))
{
    // Proceed with your code.
}
Các tham số NULL, NULL là kiểu con trỏ, cái này bạn có thể nhận về version max, min của sự cài đặt EGL hiện tại. Tôi không muốn đi sâu ở đây, điều quan trọng là hiểu được bước này. API EGL cần biết nơi mà hiển thị để khởi tạo, chỉ cấn có vậy.

OK! Bước tiếp theo là cấu hình. Một khi EGL đã biết màn hình hiển thị. Nó có thể chuẩn bị cầu nối giữa đầu ra của Opengl và màn hình thiết bị. Để bắt đầu xây dựng cầu nối này, EGL cần vài cấu hình, cái này bao gồm định dạng màu sắc, màu riêng, kích thước, sự rõ dàng, mẫu pixels, định dạng pixel và rất nhiều định dạng khác…Mặc định EGL cung cấp rất nhiều hàm cho bước này. Như eglGetConfigs, eglChooseConfigs. Sự can thiệp của nhà cung cấp là nhiều hơn bởi vị họ phải cung cấp các thiết bị và cấu hình của họ.
Bước cuối cùng thì đơn giản hơn. Sau tất cả các cấu hình, bạn hướng dẫn EGL API để tạo ra một Render surface, điều này có nghĩa là, Surface trên đầu ra render của Opengl của bạn sẽ được đặt. Bạn có thể chọn giữa màn hình hoặc Off-screen Surface. Nghĩa đầu tức là đầu ra tới trực tiếp màn hình divices của bạn. Nghĩa thứ 2 tức là đầu ra tới 1 buffer hoặc 1 file ảnh nào đó. Bạn có thể định nghĩa surface bằng việc sử dụng eglCreateWindowSurface hoặc eglCreatePbufferSurface cả 2 hàm này đều trả về 1 EGLSurface.
Tôi có 1 lời khuyên nếu bạn đặt đầu ra là off-Screen surface. Thì tốt nhất bạn nên chọn Frame Buffer trực tiếp với API của Opengl thay vì khởi tạo một Pbuffer của EGL. Nó sẽ nhanh hơn và chi phí ít hơn cho APP của bạn.
Vâng! Đây là 1 mặt của cầu nối, còn 1 mặt khác phía bên Opengl

·        EGL CONTEXT
Từ đầu đến giờ. EGL được biết tất cả những gì cần thiết về window System. Nhưng bây giờ EGL được biết về cách sử dụng Opengl. Sâu hơn. EGL làm việc với 2 Frame buffer. EGL sử dụng 2 frame buffer này nó đặt đầu ra của Opengl vào trong surface mong muốn của bạn (Screen, snapshot…framebuffer..)
Để thực hiện điều này, EGL cần được biết nơi mà buffer của Opengl mà bạn muốn render. Bước này thì rất đơn giản. Tất cả những gì chúng ta cần là khởi tạo EGL Context và thực hiện điều này ở hiện tại (chúng ta có thể tạo ra nhiều context). Một khi chúng ta đã thực hiện tạo ra 1 current context, bước tiếp theo frame buffer chúng ta sử dụng trong Opengl sẽ được sử dụng bởi EGL context. Chỉ cần 1 frame buffer là có thể sử dụng lúc này. Các hàm EGL to context sau đây:
EGL CONTEXT
EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext shareContext, const EGLint* attribList)

·             display: The previously get display.
·             config: The previously set configuration.
·             shareContext: Usually is EGL_NO_CONTEXT to share no context.
·             attribList: To OpenGL ES, this parameter determines which version of OpenGL ES will be used. Value 1 represent a context of OpenGL ES 1.x and a value of 2 represent a context of OpenGL ES 2.x.
EGLBoolean eglmakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)

·             display: The display obtained previously.
·             draw: The surface obtained previously.
·             read: The same value as draw.
·             context: The context to be the curren
Có vẻ khó hiểu ở đây nhưng bạn không cần quan tâm. Bạn chỉ cần hiểu một EGL’s Context miêu tả mặt còn lại của Opengl của cầu nối. Lời khuyên quan trọng nhất tôi có thể cung cấp cho bạn là: Hãy tìm các nhà cung cấp tài liệu hướng dẫn của EGL API.
·        RENDERING WITH EGL CONTEXT
Một khi EGL đã biết về Windowing System và có 1 context để biết về ứng dụng Opengl của bạn. Chúng ta có thể thực hiện đầu ra Render của chúng ta được đưa lên trên Surface mà ta mong muốn.
            Bước Render thì rất đơn giản. Bạn có nhớ là EGL làm việc với 2 frame buffers bên trong nó? Bây giờ là lúc sử dụng điều này. Tất cả những gì chúng ta cần là hướng dẫn EGL để trao đổi các bộ đệm. Tại sao phải trao đổi?    

            Trong khi EGL đưa ra 1 frame buffer tới surface bạn muốn. Một cái khác ở đằng sau đang chờ 1 đầu ra render mới. Buffer ở đằng sau sẽ được lấp đầy với tất cả các renders bạn đã thực hiện cho đến lời gọi tiếp theo để EGL swap các buffers và khi bạn thực hiện điều này, EGL mang buffer đằng sau tới đằng trước, và đưa ra đầu ra cuối cùng đến surface, trong khi frame buffer cũ ở đằng trước sẽ chuyển lại đằng sau để khởi tạo lại tiến trình.
Kỹ thuật này là một lợi thế lớn về hiệu suất ứng dụng của chúng ta, bởi vì Surface cuối cùng của chúng ta sẽ không được thông báo mỗi lần chúng tôi thực hiện một lệnh render. Surface cuối cùng sẽ được thông báo chỉ khi chúng ta hoàn thành tất cả các lệnh Renders. Cải tiến khác là bởi vì các bộ đệm đằng sau sẽ nhận được kết quả render nhanh hơn so với màn hình của thiết bị, ví dụ.

EGL API swap the buffers to present the render onto the desired surface.
SWAP THE EGL’S BUFFERS
EGLBoolean eglSwapBuffers(EGLDisplay display, EGLSurface surface)

·             display: The display obtained previously.
·             surface: The surface obtained previously.
OK, đây  là tất cả về EGL làm cầu nối giữa lõi của Opengl và  hệ thống Window. Tôi biết có vẻ như nhiều bước để chỉ ra một cách vẽ đơn giản. Nhưng thực ra, chỉ là một chút cài đặt:

1. Khởi tạo các API EGL với màn hình hiển thị và Surface được đưa ra bởi các nhà cung cấp.
2. Thực hiện các cấu hình với Surface mà bạn muốn hiển thị.
3. Create a context and make it your current context.
4. Ask for your EGL context to swap its internal buffers.
----------------------------FINISH------------------------------------------------------------------------

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

Đăng nhận xét