gpt4 book ai didi

opengl - ffmpeg 到 opengl 纹理与 glTexImage2D

转载 作者:行者123 更新时间:2023-12-04 23:34:19 34 4
gpt4 key购买 nike

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

我搜索了几个教程(StackOverflow,....)如何在 OpenGL 中转换我的 pFrameRGB-> 数据 [0] 纹理,但它仍然显示了一个白色方 block 。我将我的视频转换为 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]);
}

我试着跑,但什么也没有……

最佳答案

在您的源代码中,您有以下几行:

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);

I converted my video to 512x256 to comply with 2 ^ n.



不需要,从 OpenGL-2 开始。因为那个版本的纹理图像可能是任意尺寸的。

也不是将视频帧传递到 glTexImage2D ,它会进行完整的纹理对象初始化,我建议你使用 glTexSubImage2D它只是替换图像数据。您必须调用 glTexImage2D一次,在第一次调用 glTexSubImage2D 之前,具有正确的格式参数;传递一个指向数据的空指针来初始化纹理而不设置数据。

关于opengl - ffmpeg 到 opengl 纹理与 glTexImage2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17062221/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com