Mipmap数组和细节级别有什么区别?

时间:2013-10-28 10:53:42

标签: opengl glsl mipmaps

textureQueryLod调用返回两个组件: 1. x - 表示使用mipmap级别的比例。 2. y - 详细程度。

他们俩都一样吗?

1 个答案:

答案 0 :(得分:4)

当你遇到这样的问题,并且通过查看basic API documentation一类GLSL函数找不到它时,你应该参考formal GLSL specification

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

回想一下,有两种方法可以解析mipmap示例:

  1. 插入两个最近的mipmap LOD(线性mip过滤器)

    • 这是 tri - 线性过滤器中的3 rd 线性

  2. 采样最近的mipmap LOD(最近的mip过滤器)
  3. 除此之外,你应该有理论基础来理解第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进行采样,并根据此值的小数部分在两者之间插入单个返回的样本

    4. textureQueryLod (...)返回的第二个组件是未释放的整数LOD。