2010-11-21 22 views
5

Tôi đang cố gắng đọc các giá trị pixel alpha bằng cách sử dụng glReadPixels. Điều đầu tiên tôi làm là đọc từng pixel một. Để cố gắng tăng tốc mọi thứ, tôi đã thử đọc tất cả các pixel cùng một lúc:glReadPixels và GL_ALPHA

GLubyte *pixels = new GLubyte[w*h*4]; 
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

và nó hoạt động nhưng thực sự chậm. Bây giờ tôi đang cố gắng lấy lại giá trị alpha, mà không lãng phí không gian cho các thành phần RGB:

GLubyte *pixels = new GLubyte[w*h]; 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei(GL_PACK_ALIGNMENT, 1); 
glReadPixels(0, 0, w, h, GL_ALPHA, GL_UNSIGNED_BYTE, pixels); 

Nhưng tôi nhận được: OpenGL error 0x0500 in -[EAGLView swapBuffers].

Bất kỳ ý tưởng nào về lý do tại sao một số INVALID_ENUM (0x0500) bị ném?

Trả lời

6

Theo số documentation on glReadPixels() for OpenGL ES, các giá trị enum hợp lệ duy nhất cho thông số định dạng là GL_RGBAGL_IMPLEMENTATION_COLOR_READ_FORMAT_OES. Bạn sẽ cần phải kiểm tra và xem những gì GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES có nghĩa là một định dạng cho iPhone, nhưng nó có thể không cung cấp hỗ trợ cho GL_ALPHA.

Trong mọi trường hợp, tôi nghi ngờ rằng đi tuyến đường đó sẽ tăng tốc đáng kể số lần đọc của bạn, bởi vì tất cả những gì sẽ làm là loại bỏ các thành phần RGB. Vấn đề hiệu suất của bạn với glReadPixels() có thể nằm ở nơi khác. Một cuộc thảo luận tốt về những lý do này có thể được tìm thấy trong chủ đề thảo luận here.

Bạn có thể kết xuất thành bộ đệm khung hình ngoài màn hình được hỗ trợ bởi kết cấu không, sau đó xử lý thêm trên GPU bằng kết cấu đó? Điều này nghe có vẻ như nó sẽ mang lại hiệu suất tốt hơn so với sử dụng glReadPixels().

+0

Cảm ơn bạn vì điều này. Về đề xuất cuối cùng của bạn, bạn có bất kỳ gợi ý nào về cách thực hiện điều đó không? – sharvey

+0

@sharvey - Xem bài viết của tôi tại đây: http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios. Ứng dụng mẫu tôi có ở đó: http://www.sunsetlakesoftware.com/sites/default/files/ColorTracking.zip sử dụng framebuffer ngoài màn hình để hiển thị kết cấu, mặc dù tôi lấy kết quả bằng cách sử dụng 'glReadPixels()' vì tôi không thể hoàn thành màu trung bình dựa trên GPU mà tôi muốn. Tôi đã kết thúc bằng cách sử dụng một thói quen C chậm hơn để làm điều này. Tôi sẽ hoàn thành điều này tại một số điểm. –

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