1

textureQueryLod 调用返回两个组件:

  1. x - 说明使用的 mipmap 级别的比例。
  2. y - 详细程度。

他们都一样吗?

4

1 回答 1

4

当您遇到此类问题并发现通过查看一类 GLSL 函数的基本 API 文档无法充分回答时,您应该查阅正式的 GLSL 规范

如果您阅读规范,特别是第 8.9.1 节 - 纹理查询函数,您会遇到对“已使用”mipmap 级别的非常详细的说明。简而言之,该值是在缩小+mipmap 过滤期间用于选择最近的 mipmap 级别的小数部分。

回想一下,有两种可能的方法来解析 mipmap 样本:

  1. 在两个最近的 mipmap LOD 之间进行插值(线性 mip 过滤器)

    • 这是线性滤波器 中的第三 线性

  2. 采样最近的 mipmap LOD(最近的 mip 过滤器)

有了这些,您应该有理论基础来理解第 155 页规范中提供的伪代码:

float ComputeAccessedLod(float computedLod)
{
    // Clamp the computed LOD according to the texture LOD clamps.
    if (computedLod < TEXTURE_MIN_LOD) computedLod = TEXTURE_MIN_LOD;
    if (computedLod > TEXTURE_MAX_LOD) computedLod = TEXTURE_MAX_LOD;
    // Clamp the computed LOD to the range of accessible levels.
    if (computedLod < 0.0)
        computedLod = 0.0;
    if (computedLod > (float)
        maxAccessibleLevel) computedLod = (float) maxAccessibleLevel;
    // Return a value according to the min filter.
    if (TEXTURE_MIN_FILTER is LINEAR or NEAREST) {
        return 0.0;
    } else if (TEXTURE_MIN_FILTER is NEAREST_MIPMAP_NEAREST
               or LINEAR_MIPMAP_NEAREST) {
        return ceil(computedLod + 0.5) - 1.0;
    } else {
        return computedLod;
    }
}

这段伪代码有三个分支:

  1. 处理采样器根本不使用 mipmapping 的情况
    • 访问的 LOD 始终为 0.0
  2. 处理采样器使用最近的 mip 过滤器的情况
    • 访问的 LOD 是最接近的整数
  3. 处理采样器使用线性 mip 过滤器的情况
    • 访问的 LOD 在两个最接近的整数 LOD 之间
    • 在这种情况下,将采样两个LOD,并根据该值的小数部分在两者之间插值单个返回的样本

返回的第二个分量textureQueryLod (...)是未钳位的整数 LOD。

于 2013-10-28T22:14:31.640 回答