2012-02-13 30 views
5

Trong iOS 5, bộ đệm Kết cấu OpenGL ES được giới thiệu để cung cấp cách trực tiếp từ dữ liệu video camera đến OpenGL mà không cần sao chép bộ đệm. Đã có một giới thiệu ngắn gọn về bộ đệm kết cấu trong session 414 - Advances in OpenGL ES for iOS 5 of WWDC 2011.Sử dụng bộ đệm kết cấu OpenGL ES thay vì glReadPixels để lấy dữ liệu kết cấu

Tôi tìm thấy một thú vị article mà lạm dụng khái niệm này hơn nữa cuối cùng và circumvents một cuộc gọi đến glReadPixels bằng cách đơn giản khóa kết cấu, và sau đó truy cập bộ đệm trực tiếp.

glReadPixels thực sự chậm do trình kết xuất dựa trên hình nền được sử dụng trong iPad 2 (ngay cả khi bạn chỉ sử dụng kết cấu 1x1). Tuy nhiên, phương pháp được mô tả dường như xử lý nhanh hơn glReadPixels.

Phương pháp được đề xuất trong bài viết thậm chí hợp lệ và nó có thể được sử dụng để tăng cường các ứng dụng dựa trên glReadPixels không?

Vì OpenGL xử lý dữ liệu đồ họa song song với CPU, cách gọi CVPixelBufferLockBaseAddress biết khi kết xuất được thực hiện mà không cần nói chuyện với OpenGL?

Trả lời

4

Tôi mô tả phương tiện làm điều này trong this answer, dựa trên bài viết được liên kết ở trên và mẫu ChromaKey của Apple từ WWDC 2011. Do Apple đã sử dụng mẫu này trong một trong các mẫu của họ và tôi không nghe thấy bất kỳ điều gì chống lại điều này từ các kỹ sư OpenGL ES của họ, tôi tin rằng đây là một sử dụng hợp lệ của bộ đệm kết cấu. Nó hoạt động trên mọi thiết bị tương thích iOS 5.x mà tôi đã thử và cũng hoạt động trên iOS 5.0 và 5.1. Nó nhanh hơn rất nhiều so với glReadPixels().

Theo như khi khóa địa chỉ cơ sở bộ đệm pixel, bạn sẽ có thể sử dụng glFlush() hoặc tương tự để chặn cho đến khi tất cả dữ liệu được hiển thị cho kết cấu FBO của bạn. Điều này dường như làm việc cho 30 mã hóa phim 1080p FPS tôi đã thực hiện từ FBOs kết cấu được hỗ trợ.

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