The way I recommend learning is to take a fixed functional program and slowly start turning it into a main profile, adding each bit at a time. Basically, there are 3 main things that you need to solve, and, unfortunately, everything is pretty big and attached to each other in such a way that if you don't get anything on the screen, you donβt know which bit is broken. But if you can do it right, you should be fine.
First, examine the vertex buffer objects and the vertex array object. To cut glBegin, glEnd, glVertex3f, glColor4f, glNormal3f, glTexCoord2f, etc.
Learn the manual transformations of the matrix into the ditch glRotatef, glTranslate, glPushMatrix, glPopMatrix, glMatrixMode, glLoadIdentity, GL_PROJECTION, GL_MODELVIEW, glFrustum, glOrtho, gluLookAt, gluPerspective, gluOrtho2. I recommend looking at glm, which mentions the OpenGL site in its SDK. Although you still use fixed functional components in a non-core profile, you can manually load the matrix using glLoadMatrixf, later you will need to bind the matrices to the shaders.
Learn the basic GLSL shaders. There are legacy gl_vertex, gl_normal, ftransform () that should still work with VBO, you can use them until you fully configure the shader bindings.
Then do all the shader bindings, use the vertex attributes instead of the fixed gl_vertex and gl_position. Use the form to load the model and projection matrices, not ftransform (). and things like lights and material properties (I usually load the modelviewprojection project, not just projection, so the shader does not calculate this every time).
Finally, use the main profile, you will need a toolkit for windows that supports its creation. GLUT, GLFW. SMFL does not. SDL 1.3-dev does. Unfortunately, I do not think pygame. The main profile will feature any outdated functionality that has remained lying.