在iOS 5.0 OpenGL ES 2.0纹理缓存上使用mipmap过滤

时间:2012-04-24 09:48:32

标签: ios opengl-es opengl-es-2.0

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

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

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

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

1 个答案:

答案 0 :(得分:2)

只能为二次幂大小的纹理生成Mipmap。我认为iOS相机返回的视频帧尺寸都不具有二维功率。为了在仍然生成mipmap的同时使用纹理缓存,我认为你必须做一些事情,比如将纹理重新渲染到由纹理支持的二次幂FBO,然后为它生成一个mipmap。 / p>

那就是说,这可能不是达到你想要的最佳方式。 Mipmap仅在屏幕上使纹理变小时才有用,而不是使其变大。此外,它们在运行时生成速度非常慢,因此会拖累整个视频处理。

放大时会看到什么样的锯齿?当放大视频帧时,正常的硬件纹理过滤应该产生相当平滑的图像。作为示例,从我的GPUImage框架中获取并运行FilterShowcase示例,然后查看裁剪过滤器。放大视频的某个部分似乎可以很好地平滑事物,只需使用硬件过滤。

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