我正在使用纹理缓存将视频帧绘制到屏幕上,就像 Apple 的 RosyWriter 示例应用程序一样。
我想将图像从 1080p 下采样到大约 320x480(出于各种原因,我不想以较低的分辨率捕获)并使用 mipmap 过滤来消除锯齿。但是,当我尝试添加时:
glGenerateMipmap(CVOpenGLESTextureGetTarget(inputTexture));
glTexParameteri(CVOpenGLESTextureGetTarget(inputTexture), GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
我只是看到黑屏,就好像没有生成 mipmap 一样。我正在从一种纹理渲染到另一种纹理。源和目标都使用纹理缓存映射到像素缓冲区。
最佳答案
Mipmap 只能为大小为 2 的幂的纹理生成。我能想到的 iOS 相机返回的视频帧大小都没有二次方。为了在生成 mipmap 的同时使用纹理缓存,我认为你必须做一些事情,比如将纹理在屏幕外重新渲染为由纹理支持的二次方 FBO,然后为此生成一个 mipmap。
也就是说,这可能不是实现您想要的目标的最佳方式。 Mipmap 仅在使屏幕上的纹理变小而不是变大时有用。此外,它们在运行时生成的速度非常慢,因此这会拖累整个视频处理过程。
放大时您会看到什么样的锯齿?当放大视频帧时,正常的硬件纹理过滤应该产生相当平滑的图像。例如,从我的 GPUImage 中获取并运行 FilterShowcase 示例框架并查看裁剪过滤器。以这种方式放大视频的一部分似乎可以很好地平滑画面,只需使用硬件过滤即可。
我确实在框架中使用 mipmap 对大图像进行平滑下采样(当 smoothlyScaleOutput 设置为 YES 时,请参阅 GPUImagePicture),但这同样是为了缩小图像,而不是放大图像。
关于ios - 在 iOS 5.0 OpenGL ES 2.0 纹理缓存上使用 mipmap 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10295499/