opengl - OpenGL中纹理有多少个mipmap

标签 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级别?

最佳答案

规范对此有些模糊。它说,如果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/

相关文章:

c++ - 在 C++ 中更新静态函数中的非静态成员

python - 在这种情况下,语法 [] 意味着什么?

java - 绑定(bind)着色器 - LWJGL 对象的不正确纹理

ios - 如何以编程方式获取最大纹理大小(宽度和高度)

graphics - 如何在一个 Metal API 场景中使用不同的片段着色器?

opengl - 为什么 POT 和 NPOT 纹理的 GL_CLAMP_TO_EDGE 不同?

python - OpenGL不渲染图形

python - opengl中有没有办法循环旋转二维线

c++ - Arcsynthesis OpenGL 3.3 教程的问题 - MAKE 错误

c++ - 在 opengl 子窗口上渲染一个 qt 覆盖窗口