1

OpenGL2.1を搭載したMacOSX用のアプリを書いています

CVOpenGLTextureRefGL_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:同じ問題がここここで報告されています

4

2 に答える 2

2

これを試して:

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);
于 2011-11-22T21:58:41.940 に答える
0

glGetTexImage()私は、これがに関して許可された動作であることを発見しましたCVOpenGLTextureRef。唯一確実な方法は、テクスチャをFBOに描画し、そこからFBOで読み取ることです。glReadPixels()

于 2011-12-03T10:53:11.257 に答える