PyOpenGL's extension wrappers

Posted on 07 Aug 2007. in development games python

Normally if you wanted to get access to an OpenGL extension, you’d have to do something like:

    from ctypes import *    
    from OpenGL import platform
    gl = platform.OpenGL
    glGetShaderiv = gl.glGetShaderiv
    glGetShaderiv.argtypes = [c_int, c_int, POINTER(c_int)]

Gross. Luckily, PyOpenGL version 3.0.0a5 and later will automatically map ARB standard functions for you when they are available. Now all you have to do is:

    from OpenGL.GL import *

And everything will be magically available to you, wrapped so you don’t have to use ctypes to create c_char_p or c_int variables to pass them.

Watch out, though! The functions won’t be mapped correctly if your display context hasn’t been created yet. Always make sure to import OpenGL after the pygame display has been initialized.

    # first initialize pygame
    import pygame
    from pygame.locals import *
    pygame.init()
    pygame.display.set_mode((800, 600), OPENGL | DOUBLEBUF)

    # now you can import it
    from OpenGL.GL import *

I would love to know how to manually tell PyOpenGL to re-map everything after initializing pygame, though. I don’t like having to reposition the import like that. Nathan Gray has a deep reload replacement for the reload builtin, which might work, but I’m not sure if that’s the best solution to this problem…