没关系,我是首先创建纹理的人,我应该非常清楚我为它加载/生成了多少个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级别?
最佳答案
规范对此有些模糊。它说,如果level参数“大于最大允许的细节水平”,则将获得GL_INVALID_VALUE
。没有确切说明如何定义。
documentation for the function清除了一下,说这是最大可能纹理(GL_MAX_TEXTURE_SIZE
)的最大LOD数。其他类似的函数(例如 glFramebufferTexture
系列)将其明确声明为GL_INVALID_VALUE
的限制。所以我希望如此。
因此,Mesa有一个错误。但是,您可以通过假设0或GL_INVALID_VALUE
错误意味着您已经走过mipmap数组的末尾来解决此问题。
话虽如此,我建议您使用 glTexStorage
,而不必再问这个问题了。这将强行阻止某人将MAX_LEVEL设置为太大的值。它是从GL 4.2开始的新功能,但已在(或将很快)在仍受支持的所有非Intel硬件上实现。
关于opengl - OpenGL中纹理有多少个mipmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9572414/