http://www.opengl.org/wiki/Getting_started In order to use OpenGL, you must get OpenGL API functions. For most libraries you are familiar with, you simply #include a header file, make sure a library is linked into your project or makefile, and it all works. OpenGL doesn't work that way. For reasons that are ultimately irrelevant to this discussion, you must manually load functions via a platform-specific API call. This boilerplate work is done with various OpenGL loading libraries; these make this process smooth. You are strongly advised to use one. If you want to do it manually however, there is a guide as to how to load functions manually. You still should use an extension loader. OpenGL context: a context is a big struct with a lot of fields. One can use glBindObject to bind one of these fields to an object (i.e. the fields are pointers, and what they point to is one of your objects). Most of these slots are limited in what kind of objects they can accept. Later on, you can access the pointer in the context and change some parameter within some object that was pointed to. compileProgram: http://pyopengl.sourceforge.net/context/tutorials/shader_1.xhtml glCreateProgram (attach shaders) glLinkProgram glValidateProgram glGetProgramiv compileShaderPrograms(programs): compileProgram each? VertexBufferObject: glUseProgram shader glEnableClientState(GL_VERTEX_ARRAY); glVertexPointerf( self.vbo ) glDrawArrays(GL_TRIANGLES, 0, 9) finally: self.vbo.unbind() glDisableClientState(GL_VERTEX_ARRAY); finally: shaders.glUseProgram( 0 ) GLES: /usr/include/GLES2/gl2.h /usr/include/GLES2/gl2platform.h /usr/include/GLES2/gl2ext.h /usr/lib/libGLESv2.so