2009-01-19 62 views
7

Tôi là một người mới với opengl. Tôi tưởng tượng glReadPixels là khủng khiếp vì vậy whats cách tốt nhất để làm điều này? Tôi đã suy nghĩ của việc có một chức năng khóa một kết cấu rect, làm một cái gì đó giống như glTexSubImage2D để sao chép các điểm ảnh vào RAM, sửa đổi nó, sau đó sử dụng glTexSubImage2D để sao chép ram trở lại vào kết cấu. Đây có phải là cách tốt không? Tôi có thể nghĩ về tối ưu hóa như một lá cờ nói không sao chép kết cấu vì bạn sẽ ghi đè lên tất cả và lưu vào bộ nhớ đệm.Cách tốt nhất để truy cập pixel trong OpenGL?

Tôi có thể sử dụng các phương pháp nào khác? Bạn có thể cho tôi biết tên của các hàm gl mà tôi có thể muốn (vì vậy tôi có thể đọc hướng dẫn) hoặc chỉ cho tôi một hướng dẫn? Tôi đã thử googling nhưng hầu hết các kết quả trông giống như nó đã không làm những gì tôi đã có trong tâm trí.

+1

Bạn có thể giải thích chi tiết về những gì bạn đang cố gắng làm không? Nils là đúng, sử dụng glReadPixels nếu bạn thực sự cần, nhưng không mong đợi nó được nhanh chóng. Nếu bạn giải thích những gì bạn đang cố gắng làm, có lẽ ai đó ở đây có thể đề xuất một phương pháp tốt hơn và tránh nhu cầu đọc pixel hoàn toàn. –

+0

Thứ hai theo yêu cầu của OJ. Có rất ít (render) những thứ cần các pixel thực tế lấy ra. –

Trả lời

6

glReadPixels là con đường để đi.

Có, tốc độ chậm - chậm khủng khiếp. Nhưng đó là cách nó được. Các đối tác DirectX (ví dụ: khóa và đọc các pixel) cũng không nhanh hơn nhiều.

Nói chung, bạn muốn tránh đọc lại pixel và thực hiện điều gì đó với CPU trên dữ liệu. Bạn có thể thực hiện một chút xử lý bằng cách sử dụng các trình đổ bóng pixel, nhưng điều đó sẽ không giúp bạn nếu bạn muốn thực hiện các ảnh chụp màn hình (nơi dữ liệu phải kết thúc trong CPU).

0

Ý tưởng tốt nhất là xử lý bộ nhớ khung đệm trên thẻ video dưới dạng chỉ ghi. Tôi nghĩ lý do là bộ nhớ video được tối ưu hóa để viết từ phía CPU, với chi phí đọc sách. (Rõ ràng là bộ nhớ video có thể được đọc ra nhanh chóng từ phía thẻ video - nó phải gửi nó đến màn hình trong thời gian thực)

Giải pháp nhanh nhất sẽ phụ thuộc vào những gì bạn đang cố gắng làm (cẩn thận để xây dựng ?).

Không có gì ngăn bạn giữ bộ đệm khung của chính bạn trong bộ nhớ chính, sau đó sao chép khung đó vào kết cấu mỗi khung và hiển thị nó trong OpenGL. Tôi đã thực hiện điều này trước và nhanh hơn rất nhiều so với glReadPixels, tuy nhiên bạn sẽ mất khả năng đọc lại kết quả của hoạt động hiển thị OpenGL khác. Sử dụng điều đó nếu tất cả những gì bạn cần làm là giữ trạng thái từng khung của một phần cảnh của bạn. ví dụ: Tạo ra một kết cấu động không thể thực hiện thông qua trình đổ bóng pixel.

Bạn cũng có thể thoát khỏi việc đọc lại một tập hợp dữ liệu nhỏ hơn nhiều. Tôi đã làm điều đó khi tôi đang chơi với hình ảnh không thực tế. Tôi lấy cảnh của tôi, đưa nó ở 160x120, đọc nó trở lại vào bộ nhớ chính, sau đó trả lại nó như một tập hợp các hình ảnh 2D.

6

Như đã nêu trước đây glReadPixels là cách để đi. Một cách để đọc framebuffer hoặc truy cập pixel nhanh hơn là sử dụng phần mở rộng ARB_pixel_buffer_object. Điều này sẽ cho phép bạn làm glReadPixels không đồng bộ và hiệu suất có thể nhanh hơn nhiều khi bạn cần đọc số lượng lớn pixel. Hiệu suất có thể nhanh hơn nhiều vì nếu bạn sử dụng định dạng "đúng", quá trình truyền được thực hiện bằng DMA và không tiêu tốn các chu kỳ CPU quý giá.

+1

bất kỳ ví dụ nào về cách sử dụng phần mở rộng 'ARB_pixel_buffer_object'? – Niklas

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