【问题标题】:How to check for mip-map availability in OpenGL?如何在 OpenGL 中检查 mip-map 的可用性?
【发布时间】:2010-06-18 08:00:07
【问题描述】:

最近我遇到了一个问题,即我的 OpenGL 程序无法在一台使用了 2 年、配备 nVidia Quadro 140 卡的联想笔记本电脑上正确渲染纹理。它运行 OpenGL 2.1.2 和 GLSL 1.20,但是当我打开 mip-mapping 时,整个屏幕都是黑色的,没有任何警告或错误。

这是我的纹理过滤器代码:

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-mapping 是问题所在。关闭它修复它:

// 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-mapping 不可用,避免混叠的最佳解决方法是什么?

编辑:

这是我真正想要的问题:

如何以编程方式检查平台上是否提供 mip-mapping?

【问题讨论】:

  • 纹理内部格式和大小是多少?某些格式在首次从扩展中引入时会有奇怪的限制(例如浮动纹理、非二次幂纹理),但 GL 2.1.2 要求其中大多数正常工作...
  • @Bahbar:在上述情况下,我只使用512x512.bmp 文件。我正在使用GL_UNSIGNED_BYTE
  • 嗯。那应该行得通。我敢打赌实现中的一个错误。
  • @Bahbar:是的,我是这么认为的。我想。 =/

标签: opengl filtering textures mipmaps


【解决方案1】:

OpenGL 1.4 需要支持自动 mipmap 生成(使用 GL_GENERATE_MIPMAP),使用 mipmap 的纹理应该可以在几乎所有的显卡上使用。 我想问题可能不是 缺少 mipmap 功能 但也许是一代 贴图。仅用于调试 目的,您可以尝试生成 使用gluBuild2DMipmaps的mipmaps?

如果此问题是此显卡/配置所特有的,那么检查更新的驱动程序也可能是一个好主意。

消除别名的好方法是multisampling

【讨论】:

  • gluBuild2DMipmaps() - 是的,我可以试试。但是它不是我的机器,所以你可能几个月都不会收到结果。但我会记住的,谢谢!
  • 多重采样无法避免三角形内的纹理混叠。它只影响多边形边界。
  • @Bahbar,也许@Greg 的意思是超级采样,这是一个很好的解决方案,但对我的需求来说太慢了。
  • 无论如何,OpenGL 3.2 增加了对纹理多重采样 (opengl.org/registry/specs/ARB/texture_multisample.txt) 的支持,尽管我坦率地承认我搞混了 ;-)
  • 这是关于基于纹理渲染到多重采样缓冲区,而不是多重采样纹理基元。
【解决方案2】:

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

但是,如果您真的想避免混叠,您可以通过 per-primitive mip-mapping 来近似 per-fragment mip-mapping。首先,您必须手动生成所有 mip-map 级别并将其上传到单独的纹理中。在渲染三角形之前,在 cpu 上计算适当的 mip-map 级别并使用与此 mip-map 级别对应的纹理。为避免大型基元上出现伪影,请将它们细分。

【讨论】:

  • 感谢您的提示。听起来总有最后的手段。 :]
【解决方案3】:

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

一些扩展在首次引入时放松了对新格式的限制(最值得注意的是,非幂的两个纹理和浮动纹理)。扩展本身清楚地表明根本不支持 mip-mapping。但在这些被集成到核心之前,对 mip-mapping 支持的要求被恢复了。

【讨论】:

    【解决方案4】:

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

    如果您只错过一个 mip 级别并启用 mipmap,您将得到您所拥有的,黑色。确保定义了 所有 级别低至 1x1,或相应地设置 GL_TEXTURE_MAX_LEVEL TexParameter。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多