使用glTexImage2D ffmpeg到opengl纹理

时间:2013-06-12 09:38:11

标签: opengl ffmpeg textures glteximage2d

我正在尝试在OpenGL中制作播放器。我使用ffmpeg解码视频。

我搜索了几个教程(StackOverflow,....)如何转换我的pFrameRGB-> OpenGL中的数据[0]纹理,但它仍然显示一个白色方块。我将视频转换为512x256以符合2 ^ n。

我知道我的pFrameRGB是正确的,因为我可以使用“SaveFrame(...)”函数创建frameX.ppm。

我使用以下来源(https://github.com/arashafiei/dranger-ffmpeg-tuto/blob/master/tutorial02.c)代码作为模型,通过调整我的播放器。

这是我的源代码:

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

你们其中一个人能解决我的问题吗?

修改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]);
}

我试着跑,但什么都没有......

1 个答案:

答案 0 :(得分: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范围内)。对于视频播放器,您通常要禁用mipmapping:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  

我将视频转换为512x256以符合2 ^ n。

不需要,如OpenGL-2。由于该版本纹理图像可能具有任意维度。

此外,我建议您使用glTexImage2D来替换图像数据,而不是将视频帧传递到glTexSubImage2D,这会进行全纹理对象初始化。在第一次使用正确的格式参数调用glTexImage2D之前,您必须拨打glTexSubImage2D一次;将空指针传递给数据以初始化纹理而不设置数据。