纹理在OpenGL中有多少个mipmap

时间:2012-03-05 19:07:44

标签: opengl textures pyopengl mipmaps

没关系,我是第一个创建纹理的人,我应该非常清楚我为它加载/生成了多少个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级别

3 个答案:

答案 0 :(得分:10)

规范对此有点模糊。它表示如果level参数大于最大允许的详细程度&#34;则会得到GL_INVALID_VALUE。具体如何定义没有说明。

documentation for the function将其清除一点,说它是最大可能纹理(GL_MAX_TEXTURE_SIZE)的最大可能LOD数。其他类似的函数(如glFramebufferTexture系列)明确指出这是GL_INVALID_VALUE的限制。所以我希望如此。

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

话虽如此,我建议使用glTexStorage,甚至不必再问这个问题。这将强制阻止某人将MAX_LEVEL设置为太大的值。从GL 4.2开始,这是非常新的,但是它仍然在所有非英特尔硬件上实现(或将很快)。

答案 1 :(得分:8)

看起来目前无法查询纹理有多少mipmap级别,缺少使用@NicolBolas'无效值检查的OPs试验/错误。对于大多数情况,我猜如果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]

  2.   

当然可以使用OP方法验证,或者在我收到GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT glFramebufferTexture2D(..., numLevels)的情况下验证。

答案 2 :(得分:0)

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