为什么OpenGL使用浮点数来定义各向异性过滤的级别?

3

整个问题都在标题中。

我真的很想知道为什么这个扩展程序使用浮点类型而不是整数。我知道如果您使用任意值,它将在不超过最大级别的情况下工作。但我一直认为这个值应该是2的整数倍。

1个回答

4
因为没有理由不使用float。各向异性或多或少代表了纹理空间中像素(或滤波器)占地面积的长宽比。(在透视投影的最一般情况下,像素占地面积将是纹理空间中的梯形,而单个长宽比仅作为近似值,好像它是一个平行四边形,但在实践中足够好。)因此,各向异性值的非整数值在数学上完全合理。 GL_EXT_texutre_filter_anisotropic完全将实际实现细节留给实现者:
引用块:

各向异性纹理过滤的特定方案取决于实现。此外,实现可以自由考虑当前纹理缩小和放大模式来控制所使用的各向异性过滤方案的具体细节。

所以实际上一个小数的各向异性设置可能会有所不同。
引用块:

但我始终认为这个值应该是2的整数倍。

实际上,大多数GPU确实使用某种方案,其中限制实际上是2的幂。如果您有一个各向异性因子x=2^i并且要访问mipmap级别m,则滤波器基本上可以从(更高分辨率的)mipmap级别m-i中获取x个样本。

此外,请注意,可以通过gl [Get]TexParameteri *()显式设置或查询aniso设置,因此您实际上可以在代码中使用完全基于整数的设置,并假装浮点参数根本不存在。

2
需要注意的是,即使 Vulkan 也使用浮点异性,但 Metal 和 D3D 却不使用。但这两个 API 不要求整数是2的幂。 - Nicol Bolas
我在考虑数学原理,但由于多个引擎不允许您使用除2x、4x、8x等之外的其他值,我感到不确定。 - Sébastien Bémelmans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接