首页 > 解决方案 > 当四边形较小时,线性纹理看起来好像是最近采样的,但在大时是线性的?

问题描述

我有一个大小为 222x372 像素的精灵,并以 3 个不同的比例(25%、40% 和 65%)对其进行渲染,以测试不同的采样选项。

如果我使用GL_NEAREST纹理看起来像素化,除非缩放到特定比例。(如预期)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

如果我使用GL_LINEAR_MIPMAP_LINEAR纹理,小时看起来模糊,大时看起来很脆。如果我使用其他 mipmap 组合,模糊、像素化或两者都会发生类似情况。(如预期)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Blurry
OR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); // Pixelated
OR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); // Blurry

如果我使用GL_LINEAR纹理,大的时候看起来很清晰,但令我惊讶的是,它是像素化的,几乎和GL_NEAREST小的时候一样。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // When small, pixelated?

看这张图片:

看到这张图片

以 25% 的比例查看GL_LINEAR- 您可以看到锯齿和像素化边缘。我期待线性插值能够平滑地融合这些边缘。

这是预期的行为吗?如果是这样,即使缩小到少量,有没有办法获得清晰的精灵?可能是在 Photoshop 中生成的自定义 mipmap 级别?

标签: openglopengl-3

解决方案


这是预期的行为,

是的。使用GL_LINEAR过滤器的足迹始终是2x2纹素。如果你缩小 50%,你的像素足迹也是 2x2 纹素,所以它仍然工作得相当好(除了像素足迹的实际大小,它在纹素网格内的确切位置也是相关的,但为了简单起见,我们忽略它这里)。

如果缩小到 25%,这意味着价值 4x4 纹素的区域被映射到屏幕上的单个像素 - 但过滤器将仅使用中间的 2x2 块。因此,在映射到屏幕的 16 个纹素值中,仅使用了 4 个,而其他 12 个的内容被完全忽略 - 因此,如果您有诸如精细细节和锐利边缘之类的高频数据,则下采样将导致很多混叠。下采样毕竟是一个低通滤波器,高频内容不能很好地保存下来。

Mipmapping 是此类问题的有意解决方案。不必在采样时过滤变化的 - 并且可能是大量的像素(例如,如果您将 1024x1024 纹理映射到单个像素,过滤器将不得不遍历超过 100 万像素!),这些操作已经预先计算. mipmap 级别 1 的纹理像素表示级别 0 的 2x2 纹理像素,级别 2 的纹理像素表示级别 0 的 4x4,依此类推。

如果是这样,即使缩小到少量,有没有办法获得清晰的精灵?可能是在 Photoshop 中生成的自定义 mipmap 级别?

自定义 mipmap 图像在您的场景中肯定会有所帮助 - 但最终的问题是:您期望什么?如果您的图像内容具有细黑线和 100% 比例的精细细节,则无法以显着较低的分辨率保留它,因此结果总是看起来有点模糊(因为现在所有精细细节落入单个像素以某种方式混合在一起),或者它看起来会像素化(因为只有落入像素中的一些细节用于表示整个像素)——奈奎斯特-香农采样定理在这种情况下成立,如所有其他。


推荐阅读