OpenGL:如何自动选择正确的mipmapping方法?

时间:2010-08-23 20:22:02

标签: c++ windows opengl

我在mipmapping不同硬件上的纹理时遇到问题。我使用以下代码:

char *exts = (char *)glGetString(GL_EXTENSIONS);

if(strstr(exts, "SGIS_generate_mipmap") == NULL){
    // use gluBuild2DMipmaps()
}else{
    // use GL_GENERATE_MIPMAP
}

但是在某些卡片上它表示支持GL_GENERATE_MIPMAP,因此gfx卡试图从mipamp所在的位置读取内存,因此该卡会将其他纹理呈现给那些miplevels。​​

我尝试了glGenerateMipmapEXT(GL_TEXTURE_2D)但它使我的所有纹理都变白了,我在使用该功能之前启用了GL_TEXTURE_2D(正如它被告知的那样)。

我也可以为每个人使用gluBuild2DMipmaps(),因为它有效。但我不想让新卡加载速度慢10倍,因为有2个用户真的有旧卡。

那么如何正确选择mipmap方法呢?

2 个答案:

答案 0 :(得分:2)

至少OpenGL 3.3支持

glGenerateMipmap作为功能的一部分,而不是作为扩展。

您有以下选项:

  1. 检查OpenGL版本,如果更新的是第一个支持glGenerateMipmap的版本,请使用glGenerateMipmap。
  2. (我推荐这个)OpenGL 1.4..2.1支持texParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE)(参见this)这将从基本级别生成mipmap。这可能在OpenGL 3中被“弃用”,但您应该能够使用它。
  3. 使用GLEEGLEW使用glewIsSupported / gleeIsSupported调用来检查扩展名。
  4. 此外,我认为不应使用扩展,而是应该更容易坚持使用OpenGL规范。许多硬件都支持OpenGL 3,因此您应该能够获得大部分所需的功能(着色器,mipmap,帧缓冲对象,几何着色器)作为OpenGL规范的一部分,而不是扩展。

答案 1 :(得分:1)

如果司机撒谎,那么你无能为力。还要记住glGenerateMipmapEXT是GL_EXT_framebuffer_object扩展的一部分。

你做错了是检查SGIS_generate_mipmap扩展并使用GL_GENERATE_MIPMAP,因为这个枚举属于核心OpenGL,但这不是真正的问题。

你描述的问题听起来像是一个非常可怕的OpenGL实现错误,我会在这些卡上使用gluBuild2DMipmaps绕过它(有一个列表并在启动时检查)。