【问题标题】:Using mipmap filtering on iOS 5.0 OpenGL ES 2.0 texture caches在 iOS 5.0 OpenGL ES 2.0 纹理缓存上使用 mipmap 过滤
【发布时间】:2012-05-11 17:43:59
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嘿布拉德,我很抱歉,这个问题令人困惑 - 我已经对其进行了编辑以使其有意义。虽然我正在添加放大功能,但这不是重点。当我缩小并且图像被下采样以便可以更轻松地流式传输时,问题实际上会发生。能够放大一个区域只是相关的,因为这意味着我不能简单地降低原始捕获分辨率,而必须在软件中手动降低采样。
    • 在着色器中简单地对图像进行低通滤波是否足以消除锯齿?我已经有了用于写入和写入帧缓冲区等的样板代码。
    • @chris838 - 在寻找其他东西时,我今天遇到了这个:mobile3dgraphics.blogspot.com/2011/04/…,它描述了在 NPOT 纹理上实现三线性过滤。这可能会帮助您在您的情况下实现更平滑的下采样。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    相关资源
    最近更新 更多