【问题标题】:What is the difference between Mipmap arrays and Level of Detail?Mipmap 数组和细节级别有什么区别?
【发布时间】:2013-10-28 10:53:42
【问题描述】:

textureQueryLod 调用返回两个组件:

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

它们都一样吗?

【问题讨论】:

标签: opengl glsl mipmaps


【解决方案1】:

当您遇到此类问题并发现通过查看 basic API documentation 的一类 GLSL 函数无法充分回答时,您应该咨询 formal GLSL specification

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

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

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

    • 这是 tri 线性过滤器中的第三个rdlinear

  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。

【讨论】:

  • 嗨 Andon,所以 x,y 都指向 mip-map 图像,唯一的区别是 x 分量由上述伪代码处理,相应地给出不同的 mip-map 级别。阅读这篇文章 [en.wikipedia.org/wiki/Level_of_detail] 讨论几何而不是纹理时,让我感到困惑的是 LOD。
  • @abhijitjagdale:详细程度只是减少细节的总称。 Mipmap 级别基本上是细节级别的实现,但它们的目的不仅仅是提高性能(它们还执行纹理抗锯齿)。至于 X 和 Y 分量之间的差异,X 遵循上面的伪代码,并给出一个从 0.0(最大细节)开始的值,然后一直到 (最小细节)。 Y,另一方面是未固定的,它是实际的 LOD 编号(始终是整数倍)。
  • 如果 Y 是整数倍,那么在将 Y 传递给函数 ComputeAccessedLod() 以获取 X 后,将始终是整数。三个返回值:1) 返回 0.0 2) 返回 ceil(y + 0.5) - 1.0。 (例如,对于 y = 5.0,x 将为 5.0) 3) 原样返回 y。
猜你喜欢
  • 2021-02-14
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2016-08-10
  • 2016-07-19
相关资源
最近更新 更多