2

最近我遇到了一个问题,即我的 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-mapping 的最佳或标准方法是什么?
  2. 如果 mip-mapping 不可用,避免混叠的最佳解决方法是什么?

编辑:

这是我真正想要的问题:

您如何以编程方式检查平台上是否可用 mip-mapping?

4

4 回答 4

3

需要 OpenGL 1.4 来支持自动生成mipmap (使用 GL_GENERATE_MIPMAP),使用 mipmap 的纹理应该可以在几乎所有的显卡上使用。我猜这个问题可能不是缺少 mipmap 功能,而是可能是 mipmap 的生成。仅出于调试目的,您可以尝试使用生成 mipmapgluBuild2DMipmaps吗?

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

消除混叠的一个好方法是多重采样

于 2010-06-18T08:32:36.030 回答
2

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

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

于 2010-06-18T19:53:54.637 回答
2

OpenGL 要求所有属于 Core 的纹理格式都支持 mip-mapping。因此,没有具体的方法来询问纹理格式是否支持 mip-mapping。

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

于 2010-06-21T14:35:59.607 回答
0

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

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

于 2011-03-02T20:49:52.070 回答