2010-06-19 39 views
8

Tôi đang cố gắng một cái gì đó giống nhưlàm thế nào để sử dụng glCopyImage2D

glEnable(texture_2d) 
glBindTexture 
glCopyTexImage2D 
glDisable(GL_TEXTURE_2D); 

Tôi nghĩ glCopyTexImage2D sẽ không làm việc với một tổ chức phi-sức mạnh của hai hình ảnh, vì vậy đó là một vấn đề; Tôi cũng đã thử glReadPixels, nhưng nó quá chậm cho mục đích của tôi.

+0

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) –

+0

Đố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. –

Trả lời

9

Nếu glReadPixels quá chậm đối với bạn, thì glCopyTexImage2DglCopyTexSubImage2D 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 glCopyTexImage2DglCopyTexSubImage2D.

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.

+0

Nghe có vẻ như tôi nên nhìn vào các đối tượng framebuffer ... Cảm ơn – Adam

1

Bạn có thể kiểm tra xem thẻ video có hỗ trợ không sử dụng 2 kết cấu không nếu nó hỗ trợ phần mở rộng ARB_texture_non_power_of_two. See here for info.

0

Để giúp tìm ra nếu "không quyền lực của hai" Vấn đề là một vấn đề, sử dụng glGetError() như thế này:

printf("error: %#06x\n", glGetError()); 

Đặt rằng ở những nơi khác nhau trong mã của bạn để chắc chắn rằng những gì dòng là gây ra vấn đề, sau đó kiểm tra mã lỗi ở đây: https://www.khronos.org/opengl/wiki/OpenGL_Error

Để sao chép một texture tôi đã làm:

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0); 
glGenerateMipmap(GL_TEXTURE_2D); 

sau khi liên kết các kết cấu. Kiểm tra tài liệu trên hai hàm này để biết thêm thông tin.

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