代码之家  ›  专栏  ›  技术社区  ›  Xavier Ho

如何检查OpenGL中的MIP映射可用性?

  •  2
  • Xavier Ho  · 技术社区  · 14 年前

    最近,我遇到了一个问题,我的OpenGL程序无法在一台使用Nvidia Quadro 140卡的2岁联想笔记本电脑上正确呈现纹理。它运行OpenGL2.1.2和GLSL 1.20,但是当我打开MIP映射时,整个屏幕是黑色的,没有警告或错误。

    这是我的纹理过滤代码:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    

    在闲逛了40分钟后,我发现问题出在mip映射上。关闭它,修复它:

    // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    // glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    

    我得到了很多别名,但至少程序是可见的并且运行良好。

    最后,有两个问题:

    1. 除了检查OpenGL版本之外,检查机器上是否有MIP映射的最佳或标准方法是什么?
    2. 如果MIP映射不可用,那么避免别名的最佳解决方案是什么?

    编辑:

    我真正想要的问题是:

    如何通过编程检查MIP映射在平台上是否可用?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Greg S    14 年前

    支持自动mipmap需要OpenGL 1.4 一代 (使用gl_generate_mipmap),使用mipmap进行纹理处理应该可以在几乎所有的图形卡上使用。 我想问题可能不是 缺少mipmapping功能 但也许这一代 MIPMAP。只是为了调试 目的,您是否可以尝试生成 使用MIPMAP gluBuild2DMipmaps ?

    如果此问题特定于此图形卡/配置,则检查更新的驱动程序也可能是一个好主意。

    消除混叠的一个好方法是 multisampling .

        2
  •  2
  •   Malte Clasen    14 年前

    如果没有可用的mip映射,您可能不想避免别名。没有mip映射的平台通常不值得麻烦。

    但是,如果您真的想要避免混叠,可以通过每个基本mip映射来近似每个片段mip映射。首先,您必须手工生成并上传所有mip映射级别到单独的纹理中。在渲染三角形之前,在CPU上计算适当的mip映射级别,并使用与该mip映射级别对应的纹理。为了避免大型原语上的伪影,对它们进行细分。

        3
  •  2
  •   Bahbar    14 年前

    OpenGL要求核心的所有纹理格式都支持MIP映射。因此,没有具体的方法来询问纹理格式是否支持mip映射。

    当第一次引入扩展时,一些扩展对新格式(最显著的是,两个纹理的非幂次和浮动纹理)放宽了这个约束。扩展本身清楚地表明,完全不支持MIP映射。但在这些集成到核心中之前,对mip映射支持的需求已经恢复。

        4
  •  0
  •   Damon    14 年前

    如果您的实现真的不支持mipmap,我会非常惊讶。你越可能错过一个或多个级别,这是很容易发生的意外。

    如果您只错过了一个MIP级别,并且启用了mipmapping,那么您得到的就是您拥有的,黑色。确保 全部的 定义低至1X1的级别,或相应地设置gl_texture_max_level tex参数。

    推荐文章