2012-03-25 22 views
11

Có phải glTexImage2DglTexSubImage2D cách duy nhất để chuyển bộ đệm pixel đến kết cấu?Cập nhật kết cấu trong OpenGL với glTexImage2D

Tại thời điểm tôi sử dụng trong một hàm thiết lập glTexImage2D truyền null như bộ đệm, và sau đó vào làm cho vòng lặp tôi gọi glTexSubImage2D với dữ liệu đệm mới trên mỗi lần lặp.

Nhưng biết rằng kết cấu sẽ không thay đổi bất kỳ thuộc tính nào như kích thước, có cách nào hiệu quả hơn để chuyển dữ liệu pixel thực tế đến kết cấu hiển thị không?

Trả lời

23

Trong hiện đại OpenGL có 4 phương pháp khác nhau để cập nhật kết cấu 2D:

1) glTexImage2D - chậm nhất một, tái tạo cấu trúc dữ liệu nội bộ.

2) glTexSubImage2D - nhanh hơn một chút, nhưng không thể thay đổi thông số (kích thước, định dạng pixel) của hình ảnh.

3) Render-to-texture với FBO - cập nhật kết cấu hoàn toàn trên GPU, rất nhanh. Tham khảo câu trả lời này để biết thêm chi tiết: https://stackoverflow.com/a/10702468/1065190

4) Đối tượng đệm pixel PBO - để tải lên nhanh từ CPU lên GPU, chưa được hỗ trợ trên OpenGL ES.

+0

Tôi thấy rằng FBO sẽ là lựa chọn tốt nhất, nhưng, kết cấu của tôi cần phải sử dụng tham số GL_LUMINANCE và tôi chỉ phát hiện ra rằng FBO không hỗ trợ như vậy. Sau đó có phải là lựa chọn duy nhất để sử dụng glTexSubImage2D không? – PerracoLabs

+0

Bạn có sử dụng OpenGL trên máy tính để bàn hoặc OpenGL ES không? –

+0

sử dụng OpenGL ES trên Android. Lý do để sử dụng GL_LUMINANCE là tôi phải truyền dữ liệu YUV420sp vào trình đổ bóng, ở đó tôi thực hiện 2 lệnh gọi tới glTexSubImage2D để truyền 2 máy bay, một cho Y và một cho UV. và do đó tôi phải sử dụng GL_LUMINANCE. tùy chọn chuyển đổi YUV thành RGB trước khi chuyển dữ liệu vào trình đổ bóng không phải là một tùy chọn vì lý do tốc độ. – PerracoLabs

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