Nếu glReadPixels
quá chậm đối với bạn, thì glCopyTexImage2D
và glCopyTexSubImage2D
sẽ không nhanh hơn rất nhiều. Trên nền tảng có hỗ trợ cho các đối tượng framebuffer, như iOS, cách được đề xuất (tức là nhanh hơn) để lấy dữ liệu hình ảnh được kết xuất GPU vào kết cấu là sử dụng kết cấu đó làm phần đính kèm màu cho đối tượng khung hình và hiển thị trực tiếp vào đó. Điều đó nói rằng, nếu bạn vẫn muốn theo đuổi phương pháp này, dưới đây là những gì bạn cần làm để sửa lỗi:
Trước tiên, bạn đang chuyển các đối số không hợp lệ đến glCopyTexImage2D
. Đối số thứ ba, internalformat
, có thể là GL_RGBA
thay vì 0
. Nếu bạn đã gọi số glGetError
sau khi gọi số glCopyTexImage2D
, có thể bạn sẽ nhận được GL_INVALID_OPERATION
. Xem trang người dùng OpenGL ES 1.1 cho glCopyTexImage2D và glCopyTexSubImage2D.
Thứ hai, như bạn đã quan sát thấy, glCopyTexImage2D
cũng yêu cầu đối số chiều rộng và chiều cao của nó cũng phải là nguồn cấp hai. Cách chính xác để giải quyết vấn đề này là phân bổ hình ảnh kết cấu bằng cách sử dụng glTexImage2D
(bạn có thể vượt qua NULL
cho pixels
tại đây), sau đó sử dụng glCopyTexSubImage2D
để sao chép nội dung của bạn vào hình chữ nhật. Lưu ý rằng glCopyTexSubImage2D
không tham số internalformat
— bởi vì nó đang cập nhật hình chữ nhật con của kết cấu, nó sử dụng định dạng hiện có của kết cấu.
Để ghi lại, glGetTexImage không tồn tại trong OpenGL ES 1.1 hoặc 2.0, đó là lý do bạn nhận được khai báo ngầm.
Bạn có biết liệu sự cố có đang tạo kết cấu hoặc sau đó hiển thị không? Có 'glCopyTexImage2D' theo sau bởi' glGetTexImage' có cùng kết quả với 'glReadPixels' không? (không được khuyến nghị là giải pháp dài hạn vì lý do hiệu suất, nhưng là bước khắc phục sự cố để xem điều gì đang xảy ra với kết cấu) –
Đối với giới hạn power-of-2, bạn có thể sử dụng 'glTexImage2D' để phân bổ kết cấu bằng nguồn -of-2 kích thước và truyền 'NULL' cho dữ liệu, sau đó là' glCopyTexSubImage2D' cho phép các tham số không phải là số 2. –