没关系,我是第一个创建纹理的人,我应该非常清楚我为它加载/生成了多少个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级别答案 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)))
- 醇>
每个连续较小的mipmap级别的降维规则是什么?
每个连续较小的mipmap级别是前一级别的一半,但如果这个半值是小数值,则应向下舍入到下一个最大整数。
...
请注意,此扩展与支持其他规则兼容,因为它只是放宽了mipmap的错误和完整性条件。同时,为开发人员提供单一的一致规则是有意义的,因为开发人员不太可能不必要地为不同的规则生成mipmap。一个合理的规则是充分和可取的,“最低”惯例是最佳选择。
当然可以使用OP方法验证,或者在我收到GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
glFramebufferTexture2D(..., numLevels)
的情况下验证。
答案 2 :(得分:0)
假设您以标准方式构建mipmap,独特图像的数量将类似于ceil(log_2(max(width,height)))+ 1。这可以通过注意到mipmap每次将图像大小减少两倍直到有一个像素来轻松得出。