我在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方法呢?
答案 0 :(得分:2)
glGenerateMipmap作为功能的一部分,而不是作为扩展。
您有以下选项:
texParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE)
(参见this)这将从基本级别生成mipmap。这可能在OpenGL 3中被“弃用”,但您应该能够使用它。 此外,我认为不应使用扩展,而是应该更容易坚持使用OpenGL规范。许多硬件都支持OpenGL 3,因此您应该能够获得大部分所需的功能(着色器,mipmap,帧缓冲对象,几何着色器)作为OpenGL规范的一部分,而不是扩展。
答案 1 :(得分:1)
如果司机撒谎,那么你无能为力。还要记住glGenerateMipmapEXT是GL_EXT_framebuffer_object扩展的一部分。
你做错了是检查SGIS_generate_mipmap扩展并使用GL_GENERATE_MIPMAP,因为这个枚举属于核心OpenGL,但这不是真正的问题。
你描述的问题听起来像是一个非常可怕的OpenGL实现错误,我会在这些卡上使用gluBuild2DMipmaps绕过它(有一个列表并在启动时检查)。