glGetTexImage не работает с CVOpenGLTextureRef - PullRequest
1 голос
/ 23 ноября 2011

Я пишу приложение для Mac OS X с OpenGL 2.1

У меня есть 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(), потому что я изменяю текстуру перед ее рендерингом, и мне нужно получить rawданные неизмененной текстуры.

РЕДАКТИРОВАТЬ: Я пытался даже с последовательным подходом, но у меня все еще есть нулевой буфер в качестве вывода

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

EDIT2: Об этой же проблеме сообщается здесь и здесь

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Попробуйте:

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);
0 голосов
/ 03 декабря 2011

Я обнаружил, что это разрешенное поведение glGetTexImage() относительно CVOpenGLTextureRef. Единственный верный способ - нарисовать текстуру в FBO, а затем прочитать ее с помощью glReadPixels()

...