【问题标题】:glGetTexImage doesn't work with CVOpenGLTextureRefglGetTexImage 不适用于 CVOpenGLTextureRef
【发布时间】:2012-01-04 06:42:43
【问题描述】:

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

我有一个CVOpenGLTextureRef,它保存着我用 GL_QUADS 渲染的纹理,一切正常。

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

//"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_NO_ERROR 但在调用glGetTexImage() 后缓冲区没有变化...它仍然是空白的。

我做错了吗?

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

编辑:我什至尝试了后续方法,但我仍然有零缓冲区作为输出

unsigned char *buffer = (unsigned char *)malloc(textureWidth * textureHeight * sizeof(unsigned char));
glGetTexImage(textureTarget, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer);

EDIT2:报告了同样的问题herehere

【问题讨论】:

  • 你真的在堆栈中分配这样的(大)数组吗?您应该使用 malloc/new 进行分配。

标签: opengl textures pixel core-video glteximage2d


【解决方案1】:

试试这个:

glGetTexImage(textureTarget, 0, GL_LUMINANCE, GL_FLOAT, buffer);

也许你在想这个成语:

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

编辑:在回读之前设置你的包对齐也可能是值得的:

glPixelStorei(GL_PACK_ALIGNMENT, 1);

【讨论】:

  • glGetTexImage 的最后一个参数应该是指向缓冲区的指针吧?因为如果我正确你的建议,应用程序就会崩溃。我不是程序员(我只是在空闲时间做这件事),因此我可能对此感到非常困惑。
  • 我认为我在第一篇文章中写的实际上是正确的。而且我确信我在第一次编辑中所写的内容也是正确的。问题不在于我的编码方式。glGetTexImage 内部有问题
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2018-08-02
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2011-08-13
    相关资源
    最近更新 更多