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ụ.
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