[Tiếng Việt] Lập trình đồ họa với OpenGL ES 2.0 - Phần 6: giới thiệu về EGL
Công dụng của EGL
Giao tiếp với window system (hệ thống cửa số) của hệ điều hành
- Truy xuất các thành phần, thiết lập các thành phần đó cho drawing surface (bề mặt vẽ)
- Tạo ra drawing surface
- Đồng bộ render GLES với các hệ thống render khác chẳng hạn OpenVG
- Quản lý các tài nguyên render chẳng hạn như texture (hoa văn)
Phần này chúng ta sẽ tập trung vào các vấn đề liên quan đến tạo cửa sổ.
Giao tiếp với window system
Có thể nói EGL là thành phần kết nối giữa GLES và hệ thống quản lý cửa sổ của hệ điều hành chẳng hạn X11 hay Wayland của Linux, Windows API, Mac API. Trước khi EGL tạo ra và khởi tạo các giá trị cho drawing surface, nó phải thiết lập phương tiện liên lạc với window system.
Các hệ thống cửa số khác có các sematic (ngữ nghĩa) khác nhau, do đó EGL cung cấp kiểu dữ liệu opaque (không nhìn thấy) là EGLDisplay mà nó encapsulate (đóng gói) tất cả các dependencies (phần phụ thuộc) cho interface (lớp giao diện - lớp trừu tượng) với window system. Hành động đầu tiên mà EGL sẽ làm là tạo và khởi tạo kết nối với màn hình EGL local (hiện tại chỗ). Nó hoàn tất sau hai lần (sequence) gọi.
Để mở một kết nối với EGL hiển thị server:
EGLNativeDisplayType được định nghĩa để khớp với kiểu hiển thị của window system. Ở Microsoft Windows thì EGLNativeDisplayType được định nghĩa là HDC - handle (xử lý) đến ngữ cảnh Windows. Tuy nhiên để code được cross-platform (đa nền tảng), chúng ta sẽ dùng EGL_DEFAULT_DISPLAY được chấp nhận và sẽ trả về một kết nối đến màn hình mặc định.
Nếu không có kết nối nào có sẵn, eglGetDisplay sẽ trả kết quả EGL_NO_DISPLAY. Lỗi này xuất hiện sẽ thông báo rằng không có EGL sẵn và không thể dùng GLES.
Kiểm lỗi
Hầu hết hàm trong EGL sẽ trả về EGL_TRUE khi thành công và EGL_FALSE khi ngược lại. Tuy nhiên EGL trả về nhiều thứ cho bạn hơn khi gọi thất bại, nó sẽ lưu lại lý do vì sao thất bại. Tuy nhiên mã lỗi sẽ không trả về trực tiếp cho bạn, bạn cần sẽ phải truy vấn EGL explicitly (tường minh) bằng cách gọi:
Bạn có thể tự hỏi tại sao cần phải dùng tới cách này trong khi có thể trả về mã lỗi trực tiếp sau khi gọi hàm xong. Dù vậy chúng ta không được bỏ qua các lỗi trả về trong hàm, do đó sẽ có khá nhiều code dư thừa trong ứng dụng chỉ để xác định mọi thứ chạy ổn. Bạn nên kiểm tra tất cả các lỗi trong quá trình development (phát triển) và debugging (gỡ lỗi) và thực hiện nó mọi lúc. Cho đến khi ứng dụng hoàn tất như ý muốn thì có thể giảm bớt quá trình kiểm lỗi.
Khởi tạo EGL
Một khi kết nối EGL được thực hiện thành công, EGL cần được thiết lập bằng cách gọi:
Nó sẽ khởi tạo EGL cấu trúc dữ liệu nằm bên trong và trả về phiên bản EGL đang được dùng gồm mã major (mã số lớn) và minor (mã số nhỏ). Nếu EGL không thể khởi tạo thì sẽ trả về mã EGL_FALSE và thiết lập mã lỗi EGL:
- EGL_BAD_DISPLAY nếu màn hình không xác định được EGLDisplay có hợp lệ.
- EGL_NOT_INITIALIZED nếu EGL không thể khởi tạo.
Xác định các thiết lập sẵn có của Surface
Khi chúng ta khởi tạo EGL, chúng ta có thể xác định kiểu và thiết lập của surface (mặt phẳng) có sẵn. Có hai cách:
- Truy vấn tất cả các thiết lập surface và chọn ra cái chúng ta cho là tốt nhất.
- Chọn sẵn các yêu cầu của chúng ta, để EGL gợi ý cái chính xác nhất.
Cách thứ hai là cách đơn giản nhất để cài đặt và cách thứ nhất sẽ trả về rất nhiều thứ bạn có thể tìm thấy. Với cả hai cách, EGL sẽ trả về EGLConfig, nó sẽ xác định cấu trúc dữ liệu nội bộ bên trong EGL chứa những thông tin nào của một màn hình riêng biệt và các thuộc tính của nó, bao gồm bit of each color component (số bit trên từng màu thành phần) hoặc depth buffer (độ sâu buffer) được liên kết với EGLConfig. Bạn có thể truy vấn bất kỳ thuộc tính nào của EGLConfig bằng cách dùng eglGetConfigAttribute, chút nữa chúng ta sẽ nói rõ hơn về nó.
Để truy vấn thiết lập của EGL, hàm sẽ trả về EGL_TRUE nếu thành công:
Có hai cách để gọi eglGetConfigs:
- Bạn thiết lập giá trị NULL (giá trị rỗng) cho tất cả mọi tham số, hàm sẽ trả về EGL_TRUE và thiết lập con số numConfigs có sẵn trong EGLConfigs. Không có thông tin nào về EGLConfigs sẽ được trả lại, nhưng các thiết lập mà bạn đã allocate (cấp phát) vùng nhớ sẽ lấy các thết lập của EGLConfigs mà bạn đang quan tâm tới.
- Bạn sẽ khởi tạo một mảng các thiết lập EGLConfigs mà các giá trị chưa được thiết lập, sau đó chuyển nó cho eglGetConfigs như là các tham số thiết lập. Thiết lập giá trị maxReturnConfigs để điều chỉnh kích thước mảng mà bạn cấp phát, điều đó đồng nghĩa việc số lượng các thiết lập tối đa sẽ được trả lại. Một khi việc gọi hàm hoàn thành, các numConfigs sẽ được cập nhật với một danh sách các thiết lập đã được chỉnh sửa. Bạn sẽ bắt đầu thực hiện trên danh sách trả về đó, truy vấn những thuộc tính thiết lập mà bạn cho là cần thiết.
(còn nữa)
Comments
Comments are closed