2014-03-14 194 views
4

在我正在開發的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 =工作/不):

Test

我使用的OpenGL ES 1.1版(雖然V2也沒有一個快速的測試工作後, )。

有沒有人遇到過這個問題?我錯過了什麼嗎?這最奇怪的部分是它只在iOS 7物理設備上失敗。

Here是與所有相關的代碼和裸骨GitHub project作爲參考依據。我已經非常容易地構建和演示這個問題。

UPDATE

這裏是updated gistGitHub 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設備)。

+0

你有正確的情況下,在這個時候,還是莫不是你調用此之前明確的機會嗎? – prabindh

+2

我已經複製你的代碼,它的工作原理。在呈現緩衝區之前,您需要調用讀像素方法。 –

+0

@prabindh在此之前,我還沒有打過電話。 –

回答

3

在發表評論時,我設法使用你的代碼,它的工作。但是,我定義了從視圖中生成渲染緩衝區的BACKING_TYPE_LAYERBACKED

雖然創建FBO的其他管道不起作用。您的FBO管道中的問題是呼叫[self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil]。刪除這條線,你應該沒問題。

+0

謝謝!你知道爲什麼這條線在iOS 6與iOS 7相比有不同的表現嗎? iOS 6實施是否錯誤? –

+1

我不知道,沒有關於傳遞nil參數的文檔。所有說的是「這個參數的值必須是一個CAEAGLLayer對象」。無論如何,調用它是沒有意義的,在iOS 6上它似乎什麼都不做,而在iOS 7上它肯定會做一些邪惡的事情:) –

0

從馬蒂奇Oblak的回答繼續,對於那些使用第二回緩衝區時,誰可能會遇到這個問題(備份數據 - 存儲不是從層)的任務,如objectpicking,在設備上,則需要重新綁定FRAMEBUFFER,渲染然後將renderBuffer重新附加到frameBuffer。對於e.g在gistbindBuffers功能將是如下

- (void)bindBuffers 
{ 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, _framebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, _renderbuffer); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _renderbuffer); 
} 
相關問題