2012-03-08 52 views
2

爲什麼glTexSubImage2D()突然導致GL_INVALID_OPERATION?glTexSubImage2D - > GL_INVALID_OPERATION

我試圖將我絕望過時的增強現實應用從iOS4.x升級到iOS5.x,但我遇到了困難。我運行iOS5.0。上週我跑了iOS4.3。我的設備是iPhone4。


這裏是從我captureOutput:didOutputSampleBuffer:fromConnection:一個代碼段

uint8_t *baseAddress = /* pointer to camera buffer */ 
GLuint texture = /* the texture name */ 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 480, 360, GL_BGRA, GL_UNSIGNED_BYTE, baseAddress); 
/* now glGetError(); -> returns 0x0502 GL_INVALID_OPERATION on iOS5.0, works fine on iOS4.x */ 

下面是從我的設置一個代碼段

GLuint texture = /* the texture name */ 
glGenTextures(1, &texture); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

爲了簡單起見,我已插入硬編碼值這裏。在我的實際代碼中,我使用CVPixelBufferGetWidth/Height/BaseAddress獲取了這些值。 EAGLContext使用kEAGLRenderingAPIOpenGLES2進行初始化。

回答

6

啊..我在發佈這個問題後立即修復了它。必須將GL_RGBA更改爲GL_BRGA。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 

希望它有助於某人。

順便說一句。如果您想編寫AR應用程序,請考慮使用CVOpenGLESTextureCache而不是使用glTexSubImage2d。它應該會更快。

+1

在iOS 5.0上,紋理緩存速度更快。我的iPhone 4S視頻幀上傳和處理時間從9.0毫秒到1.8毫秒。我描述瞭如何在這個答案中將它集成到我的框架中:http://stackoverflow.com/a/9574798/19679 – 2012-03-10 16:56:06

+0

謝謝!之前我曾經工作過的glTexImage2D(...,GL_BGRA,...,GL_BGRA,...)。將第一個切換到GL_RGBA可解決問題(glTexSubImage2D仍在使用GL_BGRA)。 – 2012-04-30 08:59:08

+2

有人可以解釋爲什麼glTexSubImage2D需要GL_BGRA而不是GL_RGBA嗎?這只是幫了我很多忙,但不明白爲什麼它不同。 – joshue 2012-09-16 18:25:40

相關問題