2013-06-12 1 views
-1

Я пытаюсь создать игрока в OpenGL. Я использую ffmpeg для декодирования видео.ffmpeg to opengl texture with glTexImage2D

Я искал несколько руководств (StackOverflow, ....), как преобразовать текстуру pFrameRGB-> данных [0] в OpenGL, но он все еще показывает мне белый квадрат. Я преобразовал свое видео в 512x256, чтобы соответствовать 2^n.

Я знаю, что мой pFrameRGB правильный, потому что я могу создать frameX.ppm с функцией SaveFrame (...).

Я использовал следующий код (https://github.com/arashafiei/dranger-ffmpeg-tuto/blob/master/tutorial02.c) как модель, адаптировав для своего плеера.

И это мой исходный код:

http://www.sourcepod.com/uagkel22-19078

ли один из вас есть решение моей проблемы?

Edit 1:

удаляю:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 1 ? GL_REPEAT : GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 1 ? GL_REPEAT : GL_CLAMP); 

И заменил:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pCodecCtx->width, pCodecCtx->height, 0, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]); 

по:

if(firstRendering){ 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pCodecCtx->width, pCodecCtx->height, 0, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]); 

firstRendering = 0; 

}else{ 

glActiveTexture(texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, pCodecCtx->width, pCodecCtx->height, GL_RGB, GL_UNSIGNED_BYTE, pFrameRGB->data[0]); 
} 

И я пытаюсь запустить но Stiil ничего ...

+0

Вы вызываете 'glEnable (GL_TEXTURE_2D)' где угодно? Я не видел этого в вашем коде. – GuyRT

ответ

0

В исходном коде у вас есть такие строки:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 1 ? GL_REPEAT : GL_CLAMP); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 1 ? GL_REPEAT : GL_CLAMP); 

Прежде всего, значения, которые вы хотите установить целые числа, так что вы должны использовать glTexParameteri (обратите внимание на i в конец).

Во-вторых, сначала отключите mipmapping, затем вы попытаетесь его повторно использовать. Если вы хотите mipmap, вы должны предоставить пирамиду полного изображения (в пределах выбранного диапазона LoD). Для видеоплеера вы обычно хотите отключить мипмаппинг:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

я преобразовал мое видео 512x256 соответствовать 2^п.

Не нужно, начиная с OpenGL-2. Поскольку эта версия текстур изображения может быть произвольной размерности.

Кроме того, вместо передачи видеокадров в glTexImage2D, который выполняет инициализацию полного объекта текстур, я предлагаю вам использовать glTexSubImage2D, который просто заменяет данные изображения. Вы должны позвонить glTexImage2D один раз, до первого вызова glTexSubImage2D с правильными параметрами формата; передать нулевой указатель на данные для инициализации текстуры без установки данных.

+0

Я заменяю свой код в соответствии с вашими советами, но все равно ничего ... Что не так с моим кодом ... – 2kPi

+0

@ 2kPi: Только способ сказать: Помет, что вещь с множеством ошибок проверки ошибок и регистрации журнала диагностики. – datenwolf