Vertex Transformation: Difference between revisions
No edit summary |
m deprecation. |
||
Line 1: | Line 1: | ||
{{deprecated}} | |||
This page contains a small example that shows how a vertex is transformed.<br> | This page contains a small example that shows how a vertex is transformed.<br> | ||
This page will demonstrate:<br> | This page will demonstrate:<br> |
Revision as of 06:24, 20 September 2009
Warning: This article describes legacy OpenGL APIs that have been removed from core OpenGL 3.1 and above (they are only deprecated in OpenGL 3.0). It is recommended that you not use this functionality in your programs. |
This page contains a small example that shows how a vertex is transformed.
This page will demonstrate:
object space ---> world space
world space ---> eye space
eye space ---> clip space
clip space ---> normalized device space
normalized device space ---> window space
Let's built a projection matrix.
glLoadIdentity(); glFrustum(-0.1, 0.1, -0.1, 1.0, 1.0, 1000.0);
The resulting matrix looks like this
[1.81, 0.00, 0.81, 0.00] [0.00, 1.81, 0.81, 0.00] [0.00, 0.00, -1.00, -2.00] [0.00, 0.00, -1.00, 0.00]
Let's built a very simple modelview matrix
glLoadIdentity(); glTranslatef(1.0, 2.0, 3.0);
The resulting matrix looks like this
[1.0, 0.00, 0.00, 1.00] [0.00, 1.0, 0.00, 2.00] [0.00, 0.00, 1.00, 3.00] [0.00, 0.00, 0.00, 1.00]
and of course, the viewport also matters
glViewport(0, 0, 800, 600);
The vertex you give to GL is considered to be in object space.
Let's assume the values are [21.5, 58.6, -99.6, 1.0]
Notice that w=1.0
When you transform a vertex by the modelview, the vertex is considered to be in eye space.
Note: The modelview matrix is actually 2 matrices in 1. The world matrix which transforms from object space to world space and the view matrix which transforms from world to eye space.
The vertex becomes [22.5, 60.6, -96.6, 1.0]
When you transform a vertex by the projection matrix, you get [-38.12, 31.14, 94.79, 96.59]. This is called clip coordinate.
Then w inverse is computed : 1/96.59 = 0.0103520
Each component is multiplied by the 1/w, you get [-0.394692, 0.322417, 0.981277, 1.0] This is called normalized device coordinates.
Here, if z is from -1.0 to 1.0, then it is inside the znear and zfar clipping planes.
Now the final stage of the transformation pipeline:
The z is transformed to the 0.0 to 1.0 range. Anything outside this range gets clipped away. Notice that glDepthRange() has an effect here. By default, glDepthRange(0.0, 1.0)
The final operation looks like this
windowCoordinate[0]=(viewport[2] * x +(viewport[0] + viewport[2])) * 0.5; windowCoordinate[1]=(viewport[3] * y +(viewport[1] + viewport[3])) * 0.5; windowCoordinate[2]=(1.0 + z)*0.5; //Convert to 0.0 to 1.0 range. Anything outside that ranges gets clipped.
and the vertex will now be [242.123, 396.725, 0.990639]
W doesn't matter.