2012-03-17 27 views
13

Tôi sử dụng GLkit/GLKView trong dự án IOS OpenGL ES 2.0 để quản lý chu kỳ FBO/vòng đời mặc định của ứng dụng.Lấy id bộ đệm khung mặc định từ GLKView/GLKit

Trong OpenGL trên máy tính để ràng buộc FBO mặc định (đệm phía trước), tôi có thể gọi glBindFrameBuffer (GL_FRAMEBUFFER, 0) nhưng đây không phải là trường hợp trong ứng dụng IOS vì bạn phải tự tạo FBO mặc định và nó sẽ có một ID duy nhất;

Vấn đề là kiểu mã hóa GLKit/GLKView buộc tôi sử dụng chức năng "bindDrawable" của GLKView để kích hoạt FBO mặc định làm cho thiết kế hệ thống rendering nền tảng của tôi hơi xấu xí (phải lưu trữ con trỏ GLKView như void * trong C++ lớp động cơ và cầu đúc mỗi khi tôi muốn thực hiện ràng buộc FBO mặc định)

Có cách nào để lấy ID FBO mặc định GLKit/GLKView tạo để tôi có thể lưu trữ và sử dụng nó để ràng buộc bộ đệm khung mặc định trong mã của tôi?

Tệ nhất là tôi có thể quay trở lại để tạo FBO mặc định cho bản thân và giải thích GLKit/GLKView nhưng nó là một khung làm đẹp mà tôi muốn tiếp tục sử dụng nó.

Xin lỗi vì tiếng anh xấu của tôi và cảm ơn trước vì bất kỳ câu trả lời nào.

Trả lời

22

Có lẽ bạn có thể nhận được "hiện tại" bộ đệm khung ID ngay sau khi cuộc gọi bindDrawable của bạn, bằng cách gọi một cái gì đó như:

GLint defaultFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO); 
+0

Tác phẩm này rất hay, Cảm ơn câu trả lời của bạn (Rất tiếc, chưa thể bỏ phiếu). –

+0

Tuyệt vời, vui vì nó đã làm việc cho bạn. –

0

Câu trả lời được đưa ra chắc chắn là giải pháp thích hợp, tuy nhiên nó không giải quyết lỗi trong sự hiểu biết của bạn về sự khác biệt về khái niệm giữa OpenGL tiêu chuẩn và OpenGL cho các hệ thống nhúng. // ----------------------------------------------- Tôi cảm thấy cần phải chỉ ra ở đây rằng lệnh gọi glBindFramebuffer (GL_FRAMEBUFFER, 0) không trả lại kết xuất cho bộ đệm khung chính mặc dù nó có vẻ như vậy đối với các máy chạy Windows, Unix (Mac) hoặc Linux. Máy tính để bàn và máy tính xách tay không có khái niệm về bộ đệm khung hệ thống mặc định chính. Ý tưởng này bắt đầu với các thiết bị cầm tay. Khi bạn thực hiện lệnh openGL bind với 0 bằng tham số thì những gì bạn đang làm là thiết lập hàm này thành NULL. Đó là cách bạn tắt chức năng này. Nó giống với glBindTexture (GL_TEXTURE_2D, 0); Có thể là trên một số thiết bị cầm tay mà trình điều khiển tự động kích hoạt bộ đệm khung hệ thống chính khi bạn đặt bộ đệm khung thành NULL mà không kích hoạt bộ đệm khác. Đây sẽ là một sự lựa chọn được thực hiện bởi nhà sản xuất và không phải là một cái gì đó mà bạn nên đếm trên, đây không phải là một phần của spec spec OpenGL ES. Đối với máy tính để bàn và máy tính xách tay, điều này là hoàn toàn cần thiết vì việc tắt bộ đệm khung là bắt buộc để quay lại hiển thị OpenGL bình thường. Nhưng hãy nhớ! đây không phải là trở về bất kỳ bộ đệm khung chính nào, bạn đang tắt bộ đệm khung đã kích hoạt.

0

Cách thích hợp để ràng buộc bộ đệm khung mặc định trong GLKit là gọi phương thức bindDrawable trên GLKview.

[self bindDrawable] hoặc [myglkview bindDrawable] tùy theo ngữ cảnh.

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