如何检查OpenGL中的mip-map可用性?

时间:2010-06-18 08:00:07

标签: opengl filtering textures mipmaps

最近我碰到了一个问题,我的OpenGL程序无法在配备nVidia Quadro 140卡的2年前联想笔记本电脑上正确渲染纹理。它运行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不可用,那么避免别名的最佳解决办法是什么?
  3. 修改

    这是我真正追求的问题:

    如何在程序上检查平台上是否提供mip-mapping?

4 个答案:

答案 0 :(得分:3)

支持自动mipmap 生成(使用GL_GENERATE_MIPMAP)需要OpenGL 1.4,几乎每张显卡都应该使用mipmap进行纹理处理。 我猜问题可能不是     缺少mipmapping功能     但也许是一代人的     的贴图。只是为了调试     目的,你可以尝试生成     mipmap使用gluBuild2DMipmaps

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

摆脱锯齿的好方法是multisampling

答案 1 :(得分:2)

如果没有可用的mip-mapping,您可能不希望避免别名。没有mip-mapping的平台通常不值得麻烦。

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

答案 2 :(得分:2)

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

一些扩展,在第一次引入时,正在放宽对新格式的约束(最值得注意的是,两种纹理的非幂和浮动纹理)。扩展本身明确表示根本不支持mip-mapping。但在将这些内容集成到核心之前,恢复了对mip-mapping支持的要求。

答案 3 :(得分:0)

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

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