Newbie
Newbie

Reputation: 1613

OpenGL: How to select correct mipmapping method automatically?

I'm having problem at mipmapping the textures on different hardware. I use the following code:

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

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

But on some cards it says GL_GENERATE_MIPMAP is supported when its not, thus the gfx card is trying to read memory from where the mipamp is supposed to be, thus the card renders other textures to those miplevels.

I tried glGenerateMipmapEXT(GL_TEXTURE_2D) but it makes all my textures white, i enabled GL_TEXTURE_2D before using that function (as it was told to).

I could as well just use gluBuild2DMipmaps() for everyone, since it works. But i dont want to make new cards load 10x slower because theres 2 users who have really old cards.

So how do you choose mipmap method correctly?

Upvotes: 2

Views: 2283

Answers (2)

SigTerm
SigTerm

Reputation: 26429

glGenerateMipmap is supported at least by OpenGL 3.3 as a part of functionality, not as extension.

You have following options:

  1. Check OpenGL version, if it is more recent that the first one that ever supported glGenerateMipmap, use glGenerateMipmap.
  2. (I'd recommend this one) OpenGL 1.4..2.1 supports texParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE)(see this) Which will generate mipmaps from base level. This probably became "deprecated" in OpenGL 3, but you should be able to use it.
  3. Use GLEE or GLEW ans use glewIsSupported / gleeIsSupported call to check for extension.

Also I think that instead of using extensions, it should be easier to stick with OpenGL specifications. A lot of hardware supports OpenGL 3, so you should be able get most of required functionality (shaders, mipmaps, framebuffer objects, geometry shaders) as part of OpenGL specification, not as extension.

Upvotes: 2

Dr. Snoopy
Dr. Snoopy

Reputation: 56377

If drivers lie, there's not much you can do about it. Also remember that glGenerateMipmapEXT is part of the GL_EXT_framebuffer_object extension.

What you are doing wrong is checking for the SGIS_generate_mipmap extension and using GL_GENERATE_MIPMAP, since this enum belongs to core OpenGL, but that's not really the problem.

The issue you describe sounds like a very horrible OpenGL implementation bug, i would bypass it using gluBuild2DMipmaps on those cards (having a list and checking at startup).

Upvotes: 1

Related Questions