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進行初始化。
在iOS 5.0上,紋理緩存速度更快。我的iPhone 4S視頻幀上傳和處理時間從9.0毫秒到1.8毫秒。我描述瞭如何在這個答案中將它集成到我的框架中:http://stackoverflow.com/a/9574798/19679 – 2012-03-10 16:56:06
謝謝!之前我曾經工作過的glTexImage2D(...,GL_BGRA,...,GL_BGRA,...)。將第一個切換到GL_RGBA可解決問題(glTexSubImage2D仍在使用GL_BGRA)。 – 2012-04-30 08:59:08
有人可以解釋爲什麼glTexSubImage2D需要GL_BGRA而不是GL_RGBA嗎?這只是幫了我很多忙,但不明白爲什麼它不同。 – joshue 2012-09-16 18:25:40