2014-05-29 19 views
6

Tôi đang triển khai trong Android và bản gốc C++ một bản vẽ cảnh cho android bằng cách sử dụng egl 1.1. Hiện đang sử dụng số glSurfaceView của Android - cho phép tôi vẽ vào bộ đệm sau được hiển thị ở cuối "onDrawFrame" - khi bộ đệm phía sau và bộ đệm trước được đổi chỗ.Bảo quản nội dung bộ đệm sau sau eglSwapBuffers

Vấn đề của tôi là - Tôi cần có khả năng hiển thị bộ đệm sau và tiếp tục viết như thể tôi không đổi chỗ. Lý do đằng sau nhu cầu này là cảnh là rất lớn, và xây dựng nó mỗi khung là không thể, không phải là chờ đợi cho sự kết thúc của bản vẽ - kể từ khi người dùng sẽ phải chờ đợi quá lâu.

Nói cách khác - tôi cần phải tạo cảnh gia tăng. Tại một thời điểm nhất định trong khi dựng hình, tôi quyết định đã đến lúc và tôi gọi eglSwapBuffers hiển thị nội dung được rút ra từ bộ đệm sau, nhưng khi tôi tiếp tục viết rõ ràng, tôi đang viết thư cho 'bộ đệm trước đó' đồng bộ .. (không chứa những thứ tôi đã vẽ cho đến nay).

Theo như tôi thấy tùy chọn duy nhất của tôi là sao chép bộ đệm sau trước khi hoán đổi. giả:

  1. Draw để sao lưu đệm
  2. Sao chép Trở lại đệm để tạm Buffer
  3. Swap
  4. Sao chép tạm đệm (mới) lại đệm
  5. Vẽ nhiều điều để sao bộ đệm
  6. Và cứ thế ...

Câu hỏi của tôi - Có cách nào để thực hiện các bước 2,4 không?

  • Có phải glCopyPixels có hữu ích trong trường hợp này không? thí dụ?
  • glBlitFramebuffer?

Hoặc tôi có tiếp cận điều này không đúng?

Những điều tôi đã làm:

  • Tôi đã cố gắng thiết lập EGL_SWAP_BEHAVIOR-EGL_BUFFER_PRESERVED nhưng nó dường như chỉ để làm việc trên các thiết bị nhất định (như mô tả trong khronos notes):

Một số bề mặt cho phép ứng dụng để kiểm soát xem nội dung bộ đệm màu có được giữ nguyên không

  • Hiển thị lại cảnh trong mỗi khung - không thể. Tôi đã đọc nhiều lần rằng điều này được khuyến khích.

Trả lời

2

Cách tiếp cận chung của bạn là chính xác.Sử dụng glBlitFramebuffer() có thể hữu ích hơn, vì glCopyPixels chỉ sao chép một số hình chữ nhật phụ của bộ đệm vào vị trí an toàn trong cùng một bộ đệm.

Tuy nhiên, tôi có thể nghĩ đến một cách tiếp cận có khả năng tốt hơn, ít nhất là nếu OES_framebuffer_object có sẵn:

  1. bốc thăm để kết cấu hoặc một kết cấu người dùng định nghĩa renderbuffer
  2. làm để sao lưu đệm/blit renderbuffer để sao đệm
  3. swap
  4. cập nhật kết cấu/renderbuffer
  5. làm cho kết cấu vào lưng đệm/blit renderbuffer để sao lưu đệm
  6. swap
  7. [... và vân vân ...]

Bằng cách đó bạn không có một bản sao/cập nhật/copy/chu kỳ trao đổi với 2 bản mỗi khung hình, nhưng chỉ cập nhật/copy/trao đổi với một bản sao phụ.

+0

Cảm ơn bạn đã trả lời. Bạn sẽ quan tâm để xây dựng một chút? Tôi nên sử dụng phương pháp nào cho các bước 1,2? Tôi rất mới sử dụng gl (chuyển mã nền tảng chéo sang android .. - cố tìm cách thay thế cho 'presentRenderbuffer' của ios) –

+0

@DrorFichman: Có thể [trang wiki GL] (http://www.opengl.org/wiki/Framebuffer_Object) có thể giúp bạn. Nó giải thích những điều cơ bản của FBO (và cũng áp dụng cho GLES, nó chỉ là một chút giới hạn ở đó). Vì vậy, khi chương trình của bạn bắt đầu, bạn tạo một FBO, đính kèm một renderbuffer hoặc một kết cấu như bộ đệm màu. Có lẽ bạn cũng cần một bộ đệm sâu. Đối với bước 1, bạn chỉ cần ràng buộc FBO, và tất cả các rendering sẽ được thực hiện cho nó. Đối với bước 2, bạn hoặc sử dụng 'glBlitFramebuffer', hoặc, nếu bạn đính kèm một texture và không phải là một renderbuffer, bạn chỉ cần render một quad-screen toàn màn hình với texture đó được áp dụng. – derhass

Các vấn đề liên quan