2011-02-23 46 views
1

查看文檔,我應該能夠使用BGRA作爲紋理的內部格式。我用BGRA數據提供紋理(對於glRenderbufferStorage使用GL_RGBA8_OES,因爲它似乎不允許使用BGRA)。但是,以下不工作:iPhone上的BGRA glTexImage2D和glReadPixels

glTexImage2D(GL_TEXTURE_2D, 0, **GL_BGRA**, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, GL_BGRA, GL_UNSIGNED_BYTE,buffer, 0); 

雖然這給了我一個黑色的邊框:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, **GL_BGRA**, GL_UNSIGNED_BYTE,buffer, 0); 

而這個工作,但布魯斯/紅色倒置(我公司供應BGRA數據紋理):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer); 
... 
glReadPixels(0, 0, w,h, **GL_RGBA**, GL_UNSIGNED_BYTE,buffer, 0); 

...爲什麼我不能只使用BGRA?我注意到glRenderbufferStorage似乎不接受任何BGRA格式......我很困惑。 BGRA是我的數據唯一適合的格式,因爲它來自iphone的相機。

回答

5

glTexImage2D()的第三個參數是紋理中的顏色分量的數量,而不是紋理的像素排序。您想在此處使用GL_RGBA,否則它將無法工作。

我不相信GL_BGRA支持iOS設備上的glReadPixels()作爲顏色格式。雖然蘋果公司在處理視頻圖像幀時推薦使用BGRA格式的紋理像素數據,但我認爲在閱讀RGBA格式的文件並將其編碼到磁盤時是正常的,正如您在其他地方所描述的那樣。

如果你想看到一個在BGRA中使用相機視頻幀的示例項目,將它們發送到紋理,使用着色器處理它們,然後讀取返回的結果像素,可以檢查我製作的here

+0

謝謝。這就是我一直在做的事情。問題在於,在屏幕上進行傳輸時,它被倒置了。我只是在最後的着色器中進行了渲染,並且工作正常。我只是想避免任何額外的通行證,因爲我的幀速率已經在痛苦中:) – akaru 2011-02-25 23:49:38

0

我自己尋找OpenGL ES2指出這適用於iOS下的BGRA little endian原生格式。這裏「像素」指向一個32位BGRA的緩衝區,該緩衝區來自CGBitmapContextCreate()或從CGImageRef中抓取圖像數據。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels); 

看到這個here的蘋果分機。 關於這個問題的很好的討論here