Tổng quan OpenGL ES

TỔNG QUAN OPENGL ES

I. Khái niệm
OpenGL (Open Graphics Library) là một bộ thư viện đồ hoạ, bao gồm một tập khoảng 200 hàm, dùng trong các ứng dụng đồ hoạ 2 chiều và 3 chiều.

OpenGL được viết bằng C/C++, là một ngôn ngữ cấp thấp, vì thế mà OpenGL hỗ trợ được rất nhiều nền tảng khác nhau từ Mac OS, Linux, Windows, ... 

OpenGL ES (Open Graphics Library for Embedded System) là một phiên bản của OpenGL dành cho các hệ thống nhúng mà tiêu biểu là các thiết bị di động. Phiên bản này gọn nhẹ hơn do đã được bỏ bớt một số thành phần để phù hợp hơn với các thiết bị có cấu hình thấp hơn so với PC.

II. Phiên bản 
OpenGL ES hiên nay có 3 phiên bản là OpenGL ES 1.x, OpenGL ES 2.x và OpenGL ES 3.x

OpenGL ES 1.x 
Là phiên bản ra đời sớm nhất, OpenGL ES 1.x sử dụng một kỹ thuật có tên gọi là "fix pipeline", nghĩa là quy trình dựng hình đã được cố định, khó có thể thay đổi được. Điều này dẫn đến khả năng tối ưu hoá một cách tối đa cho OpenGL ES 1.x, đặc biệt trên những thiết bị đi động có cấu hình thấp vào thời điểm đó. 

OpenGL ES 2.x
Là phiên bản ra đời sau OpenGL ES 1.x, OpenGL ES 2.x sử dụng kỹ thuật mới hơn là "programmable pipeline", cho phép sửa đổi lại một vài bước trong quá trình dựng hình, tạo nên sự linh động tuyệt vời, tuy nhiên OpenGL ES 2.x đòi hỏi cấu hình thiết bị cao hơn so với OpenGL ES 1.x.

OpenGL ES 3.x
Là phiên bản mới nhất hiện nay, dựa trên OpenGL ES 2.x và được thêm vào rất nhiều tính năng mới, nhưng cũng đòi hỏi cấu hình thiết bị cao hơn.

Đối với các ứng dụng, game thuần 2D hoặc 3D đơn giản, OpenGL ES 1.x là một lựa chọn tối ưu, tuy nhiên đối với các ứng dụng 3D phức tạp, game đồ hoạ cao cấp thì OpenGL ES 2.x và OpenGL ES 3.x là lựa chọn thích hợp hơn.

III. Cấu trúc câu lệnh
Để tránh sự xung đột ngôn ngữ, OpenGL sử dụng tiền tố gl trước các câu lệnh của mình. Ví dụ một câu lệnh cơ bản của OpenGL:
  glVertex2i(1, 3);
Trong đó:
* gl : Tiền tố
* Vertex : Tên lệnh
* 2 : Số lượng tham số truyền vào
* i : Kiểu tham số truyền vào
* (1, 3) : Tham số

IV. Rendering
Rendering là quá trình chuyển đổi từ những dữ liệu 3D như vị trí, màu sắc, ánh sáng,... thành hình ảnh 2D hiển thị trên màn hình.

V. Buffers
Buffers thực chất là một khái niệm được OpenGL đưa ra dùng để trao đổi dữ liệu qua lại giữa các vùng nhớ quản lý bởi CPU và GPU.

Dữ liệu trong buffers thường là dữ liệu cần được xử lý bởi GPU (vị trí, màu sắc, đổ bóng,...).

Cụ thể, khi một chương trình OpenGL ES chạy, các dữ liệu này sẽ được sao chép từ "vùng nhớ CPU quản lý" sang buffers. Sau đó GPU sẽ lấy dữ liệu trong buffers về để xử lý và chạy song song với CPU.

Các bước thao tác với buffers:
1. Generate: Yêu cầu OpenGL ES phát sinh ra một cái mã duy nhất cho buffer. (Lấy số)
2. Bind: Yêu cầu OpenGL ES sử dụng buffer này cho thao tác kế tiếp. (Xếp hàng)
3. Buffer Data: Yêu cầu OpenGL ES cấp phát và khởi tạo vùng nhớ cho buffer, đồng thời sao chép dữ liệu cần thiết từ "vùng nhớ CPU quản lý" sang buffer. (Lấy dữ liệu)
4. Enable or Disable: Chọn lựa lúc nào kích hoạt để OpenGL ES sẽ sử dụng dữ liệu trong buffers. (Kích hoạt)
5. Set Pointers: Mô tả cho OpenGL ES biết cách để sử dụng, truy cập dữ liệu trong buffers. (Mô tả)
6. Draw: Yêu cầu OpenGL ES sử dụng các dữ liệu trong buffers đễ vẽ ra màn hình (Vẽ).
7. Delete: Yêu cầu OpenGL ES xoá những buffers phát sinh trước đó và giải phóng những resource liên quan. (Giải phóng)

Các hàm tương ứng với các bước nêu trên:
1. glGenBuffers()
2. glBindBuffers()
3. glBufferData() or glBufferSubData()
4. glEnableVertexAttribArray() or glDisableVertexAttribArray()
5. glVertexAttribPointer()
6. glDrawArrays() or glDrawElements()
7. glDeleteBuffers()

VI. Frame buffers
Frame buffers là vùng nhớ chứa thành phẩm của quá trình render (là thông tin của các pixels sẽ được hiển thị lên màn hình).

Các thao tác Generate, Bind, Delete tương tự như với buffers. Tuy nhiên frame buffers không cần bước lấy dữ liệu (Buffer Data) bởi vì dữ liệu trong frame buffer sẽ được GPU tự động chép vào. Frame buffers cũng được tự động kích hoạt (Enable) và được mô tả dữ liệu để truy cập (Set Pointers).

Ở một thời điểm có thể có nhiều frame buffers, tuy nhiên những pixel nhìn thấy trên màn hình xuất phát từ một frame buffer đặc biệt có tên gọi là "front frame buffer". 

Để đảm bảo độ mượt mà, trong quá trình render thì hệ thống thường hiếm khi render trực tiếp lên "front frame buffer" mà sẽ render lên "back frame buffer" (cũng có thể render lên nhiều frame buffer khác bên cạnh "back frame buffer"). Sau khi render thành công lên "back frame buffer" thì "front frame buffer" và "back frame buffer" sẽ đổi chỗ cho nhau gần như tức thì. Bây giờ "back frame buffer" sẽ trở thành "front frame buffer" mới, còn "front frame buffer" hiện tại sẽ trở thành "back frame buffer".






LMinh dịch và sưu tầm
Ebook: LEARING OpenGL ES FOR iOS (Erik M.Buck)

Nhận xét

Bài đăng phổ biến từ blog này

Property trong Objective-C

Quản lý bộ nhớ trong Objective-C

Optional trong Swift