【问题标题】:How many mipmaps does a texture have in OpenGLOpenGL中一个纹理有多少个mipmap
【发布时间】:2012-03-23 06:21:59
【问题描述】:

没关系,我是首先创建纹理的人,我应该非常清楚我为它加载/生成了多少 mipmap。我这样做是为了进行单元测试。似乎没有 glGetTexParameter 参数来找出这个问题。我最接近的是这样的:

int max_level;
glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level );
int max_mipmap = -1;
for ( int i = 0; i < max_level; ++i )
{
    int width;
    glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width );
    if ( 0 == width )
    {
        max_mipmap = i-1;
        break;
    }
)

无论如何,如果我使用 NVidia GPU,glGetTexLevelParameter() 将为不存在的 mipmap 返回 0 宽度,但使用 Mesa,它返回 GL_INVALID_VALUE,这让我相信这是非常错误的 要做的事情

如何找出我使用哪些 mipmap 级别填充纹理?

【问题讨论】:

标签: opengl textures pyopengl mipmaps


【解决方案1】:

规范对此有点模糊。它说如果 level 参数“大于最大允许的详细级别”,您将获得GL_INVALID_VALUE。没有说明具体是如何定义的。

documentation for the function 稍微澄清一下,说它是最大可能纹理的最大可能 LOD 数 (GL_MAX_TEXTURE_SIZE)。其他类似的函数,如glFramebufferTexture 系列明确声明这是GL_INVALID_VALUE 的限制。所以我会期待的。

因此,Mesa 有一个错误。但是,您可以通过假设 0 或 GL_INVALID_VALUE 错误意味着您已经离开 mipmap 数组的末尾来解决此问题。

话虽如此,我建议使用glTexStorage,甚至不必再问这个问题。这将强制阻止某人将 MAX_LEVEL 设置为太大的值。它是 GL 4.2 的新功能,但已在所有仍受支持的非英特尔硬件上实施(或即将实施)。

【讨论】:

    【解决方案2】:

    假设您以标准方式构建 mipmap,唯一图像的数量将类似于 ceil(log_2(max(width,height)))+1。这可以通过注意到 mipmap 每次将图像大小减小两倍直到只有一个像素来轻松得出。

    【讨论】:

    • 来吧,让这家伙放松一下。我们不必在写完之前把所有东西都做好。一个测试用例将允许调整公式。
    【解决方案3】:

    看起来目前没有办法查询纹理有多少个 mipmap 级别,除了 @NicolBolas 的无效值检查的 OP 试验/错误。在大多数情况下,如果 0 级大小不经常变化,我猜它的性能并不重要。

    但是,假设纹理没有limited number of levels,规范给出了首选计算(注意floor 的使用,而不是 ceiling 如某些示例所示):

    numLevels = 1 + floor(log2(max(w, h, d)))
    
    1. 每个连续更小的 mipmap 级别的降维规则是什么?

      每个连续较小的 mipmap 级别是前一个级别的一半大小,但如果这一半值是小数值,则应向下舍入到下一个最大整数。
      ...
      请注意,此扩展与支持其他规则兼容,因为它只是放宽了 mipmap 的错误和完整性条件。同时,为开发人员提供单一一致的规则是有意义的,因为开发人员不太可能希望为不同的规则生成不必要的 mipmap。一条合理的规则就足够且可取,而“地板”约定是最佳选择。

      [ARB_texture_non_power_of_two]

    这当然可以使用 OPs 方法进行验证,或者在我收到带有glFramebufferTexture2D(..., numLevels)GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 时。

    【讨论】:

    • 供参考,公式在glspec46,§8.14.3 Mipmapping中给出。 (相同的公式出现在 §3.8 的早期规范中,一直到 OpenGL 2.0,其中出现了 NPOT 纹理。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多