0

我正在使用纹理缓存将视频帧绘制到屏幕上,就像 Apple 的 RosyWriter 示例应用程序一样。

我想将图像从 1080p 下采样到 320x480 左右(由于各种原因,我不想以较低的分辨率捕获)并使用 mipmap 过滤来消除锯齿。但是,当我尝试添加时:

glGenerateMipmap(CVOpenGLESTextureGetTarget(inputTexture));
glTexParameteri(CVOpenGLESTextureGetTarget(inputTexture), GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

我只是得到一个黑屏,好像没有生成 mipmap。我正在从一种纹理渲染到另一种纹理。源和目标都使用纹理缓存映射到像素缓冲区。

4

1 回答 1

2

只能为 2 次幂大小的纹理生成 Mipmap。我能想到的 iOS 相机返回的视频帧大小都没有二维的幂。为了在生成 mipmap 的同时使用纹理缓存,我认为您必须执行一些操作,例如将纹理在屏幕外重新渲染到纹理支持的二次方 FBO,然后为此生成 mipmap。

也就是说,这可能不是实现您想要的最佳方式。Mipmaps 仅在使屏幕上的纹理变小而不是变大时才有帮助。此外,它们在运行时生成的速度非常慢,因此这会拖累您的整个视频处理。

放大时看到什么样的锯齿?当放大视频帧时,正常的硬件纹理过滤应该会产生相当平滑的图像。例如,从我的GPUImage框架中抓取并运行 FilterShowcase 示例,然后查看 Crop 过滤器。仅使用硬件过滤,以这种方式放大视频的一部分似乎可以很好地平滑事情。

我确实使用 mipmap 对框架中的大图像进行平滑下采样(当 smoothScaleOutput 设置为 YES 时,请参阅 GPUImagePicture),但同样是用于缩小图像,而不是放大图像。

于 2012-04-26T15:22:20.230 回答