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

标签 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 一样。我正在从一种纹理渲染到另一种纹理。源和目标都使用纹理缓存映射到像素缓冲区。

最佳答案

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/

相关文章:

java - 我可以将 java 窗口句柄传递给 OpenGL-es

android - ARCore 屏幕坐标到世界坐标 openGL

ios - GLKit 不绘制 GL_POINTS 或 GL_LINES

ios - 如何使用 Ionic 4 在 IOS 上修复 "cordova-plugin-googlemaps is not installed or ready yet"

iphone - 生成 MD5 散列的方法的奇怪行为 - 返回相同的散列结果

opengl-es - OpenGL ES 2.0 中的纹理点?

java - 纹理加载: Everything at once OR un-/loading the needed assets?

android - OpenGL ES 2.0 setLookAtM

ios - UIScrollView 及其子项 : why are they placed on top of each other? (AutoLayout)

iOS Facebook ShareLink 处理干扰 Facebook 登录