2010-11-21 109 views
5

我想使用glReadPixels讀取alpha像素值。我做的第一件事是單獨讀取像素。爲了加快速度,我試着一次讀取所有像素:glReadPixels和GL_ALPHA

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

它工作,但真的很慢。現在,我想只是獲取alpha值,不浪費空間,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); 

,但我得到:OpenGL error 0x0500 in -[EAGLView swapBuffers]

任何想法爲什麼INVALID_ENUM (0x0500)被拋出?

回答

6

根據documentation on glReadPixels() for OpenGL ES,格式參數的唯一有效枚舉值是GL_RGBAGL_IMPLEMENTATION_COLOR_READ_FORMAT_OES。您需要檢查並瞭解GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES對於iPhone的格式意味着什麼,但它可能不支持GL_ALPHA

無論如何,我懷疑這樣做會大大加快你的閱讀速度,因爲所有這些都會放棄RGB組件。 glReadPixels()的性能問題可能在別處。關於這個原因的一個很好的討論可以在討論線索here中找到。

您是否可以渲染到由紋理支持的屏幕外幀緩衝區,然後使用該紋理在GPU上進行進一步處理?這聽起來像會產生比使用glReadPixels()更好的性能。

+0

謝謝你。關於你的最後一個建議,你有沒有關於如何實現的建議? – sharvey 2010-11-22 14:18:59

+0

@sharvey - 看到我的寫在這裏:http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios。我在那裏的示例應用程序:http://www.sunsetlakesoftware.com/sites/default/files/ColorTracking.zip使用屏幕外幀緩衝區來渲染紋理,但我使用'glReadPixels()'拉入結果,因爲我無法完成我想要的基於GPU的顏色平均。我最終使用了一個較慢的C例程來做到這一點。我會在某個時候完成這個。 – 2010-11-22 15:13:01