glGetTexImage不';不要使用CVOpenGLTextureRef

glGetTexImage不';不要使用CVOpenGLTextureRef,opengl,textures,pixel,core-video,glteximage2d,Opengl,Textures,Pixel,Core Video,Glteximage2d,我正在用OpenGL 2.1为Mac OS X编写一个应用程序 我有一个CVOpenGLTextureRef,它保存了我用GL_四边形渲染的纹理,一切正常 我现在需要确定纹理的哪些像素是黑色的,因此我编写了以下代码来从纹理读取原始数据: //"image" is the CVOpenGLTextureRef GLenum textureTarget = CVOpenGLTextureGetTarget(image); GLuint textureName = CVOpenGLTextureGe

我正在用OpenGL 2.1为Mac OS X编写一个应用程序

我有一个
CVOpenGLTextureRef
,它保存了我用GL_四边形渲染的纹理,一切正常

我现在需要确定纹理的哪些像素是黑色的,因此我编写了以下代码来从纹理读取原始数据:

//"image" is the CVOpenGLTextureRef

GLenum textureTarget = CVOpenGLTextureGetTarget(image);
GLuint textureName = CVOpenGLTextureGetName(image);

glEnable(textureTarget);
glBindTexture(textureTarget, textureName);

GLint textureWidth, textureHeight;
int bytes;
glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_WIDTH, &textureWidth);
glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_HEIGHT, &textureHeight);
bytes = textureWidth*textureHeight;

GLfloat buffer[bytes];
glGetTexImage(textureTarget, 0, GL_LUMINANCE, GL_FLOAT, &buffer);
GLenum error = glGetError();
glGetError()
报告
GL\u NO\u ERROR
但在调用
glGetTexImage()
后,缓冲区保持不变……它仍然为空

我做错什么了吗

请注意,我不能使用
glReadPixels()
,因为我在渲染纹理之前修改了纹理,并且需要获取未修改纹理的原始数据

编辑:我甚至尝试了顺序方法,但仍然没有缓冲区作为输出

unsigned char *buffer = (unsigned char *)malloc(textureWidth * textureHeight * sizeof(unsigned char));
glGetTexImage(textureTarget, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer);
EDIT2:报告了相同的问题,请尝试以下操作:

glGetTexImage(textureTarget, 0, GL_LUMINANCE, GL_FLOAT, buffer);
也许你在想这个成语:

vector< GLfloat > buffer( bytes );
glGetTexImage(textureTarget, 0, GL_LUMINANCE, GL_FLOAT, &buffer[0]);

我发现这是
glGetTexImage()
对于
CVOpenGLTextureRef
允许的行为。唯一可靠的方法是将纹理绘制到FBO中,然后使用
glReadPixels()

从FBO中读取glGetTexImage的最后一个参数应该是指向缓冲区的指针,对吗?因为如果我对了你的建议,应用程序就会崩溃。我不是一个程序员(我只是在业余时间做这件事的业余爱好),所以我可能会对此感到困惑。我认为我在第一篇文章中写的是正确的。我确信我在第一次编辑中所写的也是正确的。问题不在于我的编码方式。GLGetTeximage内部有问题。你真的在堆栈中分配了这么大的数组吗?您应该使用malloc/new进行分配。
glPixelStorei(GL_PACK_ALIGNMENT, 1);