当四边形很小时,线性纹理看起来好像是最近采样的,但当四边形很大时是线性的?

Linear textures look as if they are sampled nearest when quad is small, but linearly when large?

我有一个大小为 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 级别?

Is this intended behavior,

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

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

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

and if so is there any way to get crisp sprites even when scaled down to small amounts? Custom mipmap levels generated in Photoshop perhaps?

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