在我正在開發的OpenGL ES應用程序中,我注意到glReadPixels()
函數無法在所有設備/模擬器中工作。爲了測試這個,我創建了一個裸骨樣本OpenGL應用程序。餘設置的EAGLContext上下文的背景顏色,並試圖讀取使用glReadPixels()
像素如下:glReadPixels僅在iOS 7設備上給出黑色圖像
int bytesPerPixel = 4;
int bufferSize = _backingWidth * _backingHeight * bytesPerPixel;
void* pixelBuffer = malloc(bufferSize);
glReadPixels(0, 0, _backingWidth, _backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);
// pixelBuffer should now have meaningful color/pixel data, but it's null for iOS 7 devices
free(pixelBuffer);
這工作在模擬器上按預期爲iOS 6和7和物理iOS 6的設備,但它沒有上一個物理的iOS 7設備。測試的場景列於下表(YES/NO =工作/不):
我使用的OpenGL ES 1.1版(雖然V2也沒有一個快速的測試工作後, )。
有沒有人遇到過這個問題?我錯過了什麼嗎?這最奇怪的部分是它只在iOS 7物理設備上失敗。
Here是與所有相關的代碼和裸骨GitHub project作爲參考依據。我已經非常容易地構建和演示這個問題。
UPDATE:
這裏是updated gist和GitHub project已經過更新。我更新了示例項目,以便您可以輕鬆查看glReadPixels
的內存輸出。
另外,我有一個新的觀察:當EAGLContext
是層支持([self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]
),glReadPixels
可以成功地在所有設備上讀取數據/模擬器(iOS的6和7)。但是,如果在GLView.m中切換標誌以便上下文不支持圖層([self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil]
),則glReadPixels
會顯示初始文章中表達的條件(適用於iOS 6 sim/device,iOS 7 sim,但在iOS上失敗7設備)。
你有正確的情況下,在這個時候,還是莫不是你調用此之前明確的機會嗎? – prabindh
我已經複製你的代碼,它的工作原理。在呈現緩衝區之前,您需要調用讀像素方法。 –
@prabindh在此之前,我還沒有打過電話。 –