12/08/2018, 14:17

OpenGL Pixel Buffer Object (PBO)

I. Tổng quan OpenGL ARB_pixel_buffer_object phần mở rộng là rất gần với ARB_vertex_buffer_object . Nó chỉ đơn giản là mở rộng mở rộng ARB_vertex_buffer_object để lưu trữ dữ liệu không chỉ đỉnh nhưng còn dữ liệu điểm ảnh vào đối tượng đệm. Đối tượng bộ đệm dữ liệu lưu trữ điểm ảnh này được ...

I. Tổng quan

gl_pbo01.png

OpenGL ARB_pixel_buffer_object phần mở rộng là rất gần với ARB_vertex_buffer_object . Nó chỉ đơn giản là mở rộng mở rộng ARB_vertex_buffer_object để lưu trữ dữ liệu không chỉ đỉnh nhưng còn dữ liệu điểm ảnh vào đối tượng đệm. Đối tượng bộ đệm dữ liệu lưu trữ điểm ảnh này được gọi là Pixel đệm Object (PBO). ARB_pixel_buffer_object hạn vay mượn tất cả các khuôn khổ VBO và API, cộng thêm, thêm 2 thêm "mục tiêu" thẻ. Những thẻ hỗ trợ bộ nhớ máng cỏ PBO (OpenGL driver) để xác định vị trí tốt nhất của đối tượng đệm; bộ nhớ hệ thống, bộ nhớ chia sẻ hoặc bộ nhớ video. Ngoài ra, mục tiêu mã thông báo xác định rõ ràng rằng các PBO ràng buộc sẽ được sử dụng ở một trong 2 hoạt động khác nhau; GL_PIXEL_PACK_BUFFER_ARB để chuyển dữ liệu điểm ảnh vào một PBO, hoặc GL_PIXEL_UNPACK_BUFFER_ARB để chuyển dữ liệu pixel từ PBO.

Ví dụ, glReadPixels () và glGetTexImage () là các "gói" hoạt động pixel, và glDrawPixels (), glTexImage2D () và glTexSubImage2D () được "giải nén" hoạt động. Khi một PBO là ràng buộc với GL_PIXEL_PACK_BUFFER_ARB token, glReadPixels () đọc dữ liệu pixel từ một bộ đệm khung OpenGL và viết (gói) các dữ liệu vào các PBO. Khi một PBO là ràng buộc với GL_PIXEL_UNPACK_BUFFER_ARB token, glDrawPixels () đọc dữ liệu (giải nén) pixel từ PBO và sao chép chúng vào OpenGL đệm khung.

Ưu điểm chính của PBO là nhanh điểm ảnh chuyển dữ liệu đến và đi từ một card đồ họa thông qua DMA (Direct Memory Access) mà không involing chu kỳ CPU. Và, những thuận lợi khác của PBO là chuyển DMA không đồng bộ. Hãy so sánh các phương thức truyền tải kết cấu thông thường bằng cách sử dụng một đối tượng Pixel đệm. Phía bên trái của sơ đồ sau đây là một cách thông thường để tải dữ liệu kết cấu từ một nguồn hình ảnh (file hình ảnh hoặc video stream). Các nguồn đầu tiên được nạp vào bộ nhớ hệ thống, và sau đó, sao chép từ bộ nhớ hệ thống tới một đối tượng kết cấu OpenGL với glTexImage2D (). Đây là 2 quá trình chuyển giao (tải và bản sao) đều được thực hiện bởi CPU.

gl_pbo02.png

Trên trái trong sơ đồ bên phải, nguồn hình ảnh có thể được nạp trực tiếp vào một PBO, được điều khiển bởi OpenGL. CPU vẫn liên quan đến việc tải các nguồn để các PBO, nhưng, không phải để chuyển dữ liệu điểm ảnh từ một PBO đến một đối tượng kết cấu. Thay vào đó, GPU (OpenGL driver) quản lý sao chép dữ liệu từ một PBO đến một đối tượng kết cấu. Điều này có nghĩa OpenGL thực hiện một hoạt động truyền DMA mà không lãng phí chu kỳ CPU. Hơn nữa, OpenGL có thể lên lịch một truyền DMA không đồng bộ để thực hiện sau. Do đó, glTexImage2D () trả về ngay lập tức, và CPU có thể thực hiện một cái gì đó khác mà không cần chờ chuyển pixel được làm.

Có 2 cách tiếp cận chính PBO để cải thiện hiệu suất của việc chuyển giao dữ liệu điểm ảnh: trực tuyến cập nhật kết cấu và không đồng bộ đọc lại từ bộ đệm khung .

II. Tạo PBO

Như đã đề cập trước đó, Pixel đệm Đối tượng vay mượn tất cả các API từ Vertex Buffer Object . Sự khác biệt duy nhất là có 2 thẻ bổ sung cho các PBO: GL_PIXEL_PACK_BUFFER_ARB và GL_PIXEL_UNPACK_BUFFER_ARB . GL_PIXEL_PACK_BUFFER_ARB là để chuyển dữ liệu điểm ảnh từ OpenGL để ứng dụng của bạn, và GL_PIXEL_UNPACK_BUFFER_ARB có nghĩa là chuyển dữ liệu điểm ảnh từ một ứng dụng OpenGL. OpenGL đề cập đến các thẻ để xác định không gian bộ nhớ tốt nhất của một PBO, ví dụ, một bộ nhớ video để tải lên (giải nén) kết cấu, hoặc bộ nhớ hệ thống để đọc (đóng gói) framebuffer. Tuy nhiên, các thẻ mục tiêu là chỉ gợi ý. Trình điều khiển OpenGL quyết định vị trí thích hợp cho bạn.

Tạo một PBO cần 3 bước;

  • Tạo một đối tượng bộ đệm mới với glGenBuffersARB () .
  • Ràng buộc đối tượng đệm với glBindBufferARB () .
  • Sao chép dữ liệu điểm ảnh đến đối tượng đệm với glBufferDataARB () .

Nếu bạn chỉ định một con trỏ NULL để mảng nguồn trong glBufferDataARB (), sau đó phân bổ PBO chỉ một không gian bộ nhớ với kích thước dữ liệu nhất định. Tham số cuối cùng của glBufferDataARB () là một gợi ý hiệu suất cho PBO để cung cấp cách đối tượng bộ đệm sẽ được sử dụng. GL_STREAM_DRAW_ARB là cho dòng tải lên kết cấu và GL_STREAM_READ_ARB là cho không đồng bộ đệm khung đọc lại.

III. Lập bản đồ PBO

PBO cung cấp một cơ chế lập bản đồ bộ nhớ để lập bản đồ OpenGL kiểm soát đối tượng đệm vào không gian địa chỉ bộ nhớ của khách hàng. Vì vậy, khách hàng có thể sửa đổi một phần của đối tượng đệm hoặc toàn bộ đệm bằng cách sử dụng glMapBufferARB () và glUnmapBufferARB () .

void* glMapBufferARB(GLenum target, GLenum access)

GLboolean glUnmapBufferARB(GLenum target)

glMapBufferARB () trả về con trỏ đến đối tượng đệm nếu thành công. Nếu không thì nó trả về NULL. Các mục tiêu tham số là một trong hai GL_PIXEL_PACK_BUFFER_ARB hoặc GL_PIXEL_UNPACK_BUFFER_ARB. Tham số thứ hai, truy cập xác định những gì để làm với các bộ đệm ánh xạ; đọc dữ liệu từ các PBO (GL_READ_ONLY_ARB), ghi dữ liệu vào các PBO (GL_WRITE_ONLY_ARB), hoặc cả hai (GL_READ_WRITE_ARB).

Lưu ý rằng nếu GPU vẫn còn làm việc với các đối tượng đệm, glMapBufferARB () sẽ không trở lại cho đến khi GPU thúc công việc của mình với các đối tượng đệm tương ứng. Để tránh gian hàng này (chờ đợi), gọi glBufferDataARB () với con trỏ NULL ngay trước glMapBufferARB (). Sau đó, OpenGL sẽ loại bỏ các đệm cũ, và phân bổ không gian bộ nhớ mới cho các đối tượng đệm.

Các đối tượng đệm phải unmapped với glUnmapBufferARB () sau khi sử dụng các PBO. glUnmapBufferARB () trả về GL_TRUE nếu thành công. Nếu không, nó sẽ trả về GL_FALSE.

0