2

假设我有一个自然不是正方形的纹理(例如,具有 4:1 纵横比的东西的摄影纹理)。假设我想使用 PVRTC 压缩在 iOS 设备上显示这个纹理,这要求纹理是方形的。如果我将纹理按比例放大,使其在压缩过程中呈正方形,则当从远处查看纹理时,结果是非常模糊的图像。

我相信这是由 mipmapping 引起的。由于 mipmap 过滤器看到新的更大的拉伸维度,它使用它来选择低 mip 级别,这实际上是不正确的,因为这些像素只是被拉伸到那个大小。如果它看另一个维度,它会选择更高分辨率的 mip 级别。

通过以下观察(在某种程度上)证实了这一理论,即如果我将纹理保留为不必是方形的格式,则 mipmap 版本看起来很花哨。

有一个 LOD Bias 参数,但文档说这适用于两个维度。似乎需要的是一种偏向 LOD 的方法,但仅在一个维度上(也就是说,将其偏向于在放大的纹理维度上的更高分辨率)。

除了切碎几何体以允许使用原始纹理的方形子集(这是不可行的,给我们的生产管道),有没有人用过任何聪明的技巧来处理这个问题?

4

1 回答 1

0

在我看来,您有几个选择,这取决于您可以使用顶点 UV 做什么。

[嗯刚刚意识到,在下面我假设 V 坐标从上到下运行......你需要让我成为老派 :-) ]

首先想到的是取你的 4N*N (X*Y) 源纹理并垂直重复 4x 以给出 4N*4N 纹理,然后将模型上的 V 坐标调整为它们的 1/4当前值。这不会为您节省太多内存(因为它实际上意味着 4bpp PVRTC 会变大 4 倍),但它仍然会节省带宽和缓存空间,因为不会访问纹理的其他部分。MIP 映射也可以一直工作到 1x1 纹理。

或者,如果您想节省一点空间并且您有一对 4N*N 纹理,您可以尝试将它们打包成一个“某种”4N*4N 的图集。将第一个纹理放在前 N 行中,然后在前 N/2 行中跟随它。将第二个纹理的底部 N/2 行打包,然后是第二个纹理,然后是顶部 N/2 行。最后,做第一个纹理的底部 N/2 行。对于访问第一个纹理的 UV,对 V 参数执行相同的除以 4。对于第二个纹理,您需要除以 4 并添加 0.5 这应该可以正常工作,直到 MIP 贴图级别太小以至于两个纹理混合在一起......但我怀疑这真的会成为一个问题。

于 2012-03-27T16:23:20.213 回答