为什么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初始化。

最佳答案

嗯..发布此问题后,我立即修复了问题。不得不将GL_RGBA更改为GL_BRGA。

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

希望它能帮助某人。

顺便说一句。如果要编写AR应用程序,请考虑使用CVOpenGLESTextureCache而不是glTexSubImage2d。应该会更快。

10-08 20:03