3D Graphics With OpenGL - The Basic Theory
3D Graphics With OpenGL - The Basic Theory
1. Computer Graphics Hardware 2. 3D Graphics Rendering Pipeline 3. Vertices, Primitives, Fragment and Pixels
3.1 3.2 3.3 3.4 3D Graphics Coordinate Systems Primitives Vertices Pixel vs. Fragment
4. Vertex Processing
4.1 Coordinates Transformation 4.2 Model Transform (or Local Transform, or Wor 4.3 4.4 4.5 4.6
View Transform Projection Transform - Perspective Projection Projection Transform - Orthographic Projectio Outputs of the Vertex Processing Stage
5. Rasterization
5.1 Viewport Transform 5.2 Back-Face Culling
8. Lighting
8.1 8.2 8.3 8.4
Phong Lighting Model for Light-Material Inte OpenGL's Lighting and Material Vertex and Fragment Shaders Global Illumination Model
9. Texture
9.1 Texture Wrapping 9.2 Texture Filtering
3/11/2014
and y-axis pointing down. This is different from the conventional 2D Cartesian coordinates, where y-axis is pointing upwards. The number of color-bits per pixel is called the depth (or precision) of the display. The number of rows by columns of the rectangular grid is called the resolution of the display, which can range from 640x480 (VGA), 800x600 (SVGA), 1024x768 (XGA) to 1920x1080 (FHD), or even higher.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
2/22
3/11/2014
The 3D graphics rendering pipeline consists of the following main stages: 1. Vertex Processing: Process and transform individual vertices. 2. Rasterization: Convert each primitive (connected vertices) into a set of fragments. A fragment can be treated as a pixel in 3D spaces, which is aligned with the pixel grid, with attributes such as position, color, normal and texture. 3. Fragment Processing: Process individual fragments. 4. Output Merging: Combine the fragments of all primitives (in 3D space) into 2D color-pixel for the display. In modern GPUs, the vertex processing stage and fragment processing stage are programmable. You can write programs, known as vertex shader and fragment shader to perform your custom transform for vertices and fragments. The shader programs are written in C-like high level languages such as GLSL (OpenGL Shading Language), HLSL (High-Level Shading Language for Microsoft Direct3D), or Cg (C for Graphics by NVIDIA). On the other hand, the rasterization and output merging stages are not programmable, but configurable - via configuration commands issued to the GPU.
3.2 Primitives
The inputs to the Graphics Rendering Pipeline are geometric primitives (such as triangle, point, line or quad), which is formed by one or more vertices . OpenGL supports three classes of geometric primitives: points , line segments , and closed polygons . They are specified via vertices. Each vertex is associated with its attributes such as the position, color, normal and texture. OpenGL provides 10 primitives as shown. Sphere, 3D box and pyramid are not primitives. They are typically assembled using primitive triangle or quad.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
3/22
3/11/2014
3.3 Vertices
Recall that a primitive is made up of one or more vertices . A vertex, in computer graphics, has these attributes: 1. Position in 3D space V=(x, y, z): typically expressed in floating point numbers. 2. Color: expressed in RGB (Red-Green-Blue) or RGBA (Red-Green-Blue-Alpha) components. The component values are typically normalized to the range of 0.0 and 1.0 (or 8-bit unsigned integer between 0 and 255). Alpha is used to specify the transparency, with alpha of 0 for totally transparent and alpha of 1 for opaque. 3. Vertex-Normal N =(nx, ny, nz): We are familiar with the concept of surface normal, where the normal vector is perpendicular to the surface. In computer graphics, however, we need to attach a normal vector to each vertex, known as vertex-normal. Normals are used to differentiate the front- and back-face, and for other processing such as lighting. Right-hand rule (or counter-clockwise) is used in OpenGL. The normal is pointing outwards, indicating the outer surface (or front-face). 4. Texture T=(s , t ): In computer graphics, we often wrap a 2D image to an object to make it seen realistic. A vertex could have a 2D texture coordinates (s , t ), which provides a reference point to a 2D texture image. 5. Others.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
4/22
3/11/2014
g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; / /B o t t o m f a c e g l C o l o r 3 f ( 1 . 0 f ,0 . 5 f ,0 . 0 f ) ;/ /o r a n g e g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; / /F r o n t f a c e g l C o l o r 3 f ( 1 . 0 f ,0 . 0 f ,0 . 0 f ) ;/ /r e d g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; / /B a c k f a c e g l C o l o r 3 f ( 1 . 0 f ,1 . 0 f ,0 . 0 f ) ;/ /y e l l o w g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; / /L e f t f a c e g l C o l o r 3 f ( 0 . 0 f ,0 . 0 f ,1 . 0 f ) ;/ /b l u e g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; / /R i g h t f a c e g l C o l o r 3 f ( 1 . 0 f ,0 . 0 f ,1 . 0 f ) ;/ /m a g e n t a g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l V e r t e x 3 f ( 1 . 0 f ,1 . 0 f ,1 . 0 f ) ; g l E n d ( ) ;/ /o ft h ec o l o rc u b e
Indexed Vertices
Primitives often share vertices. Instead of repeatedly specifying the vertices, it is more efficient to create an index list of vertices, and use the indexes in specifying the primitives. For example, the following code fragment specifies a pyramid, which is formed by 5 vertices. We first define 5 vertices in an index array, followed by their respectively color. For each of the 5 faces, we simply provide the vertex index and color index.
f l o a t [ ]v e r t i c e s={/ /5v e r t i c e so ft h ep y r a m i di n( x , y , z ) 1 . 0 f ,1 . 0 f ,1 . 0 f , / /0 .l e f t b o t t o m b a c k 1 . 0 f ,1 . 0 f ,1 . 0 f , / /1 .r i g h t b o t t o m b a c k 1 . 0 f ,1 . 0 f , 1 . 0 f , / /2 .r i g h t b o t t o m f r o n t 1 . 0 f ,1 . 0 f , 1 . 0 f , / /3 .l e f t b o t t o m f r o n t 0 . 0 f , 1 . 0 f , 0 . 0 f / /4 .t o p } ; f l o a t [ ]c o l o r s={ / /C o l o r so ft h e5v e r t i c e si nR G B A 0 . 0 f ,0 . 0 f ,1 . 0 f ,1 . 0 f , / /0 .b l u e 0 . 0 f ,1 . 0 f ,0 . 0 f ,1 . 0 f , / /1 .g r e e n 0 . 0 f ,0 . 0 f ,1 . 0 f ,1 . 0 f , / /2 .b l u e 0 . 0 f ,1 . 0 f ,0 . 0 f ,1 . 0 f , / /3 .g r e e n 1 . 0 f ,0 . 0 f ,0 . 0 f ,1 . 0 f / /4 .r e d } ; b y t e [ ]i n d i c e s={/ /V e r t e xi n d i c e so ft h e4T r i a n g l e s 2 ,4 ,3 , / /f r o n tf a c e( C C W ) 1 ,4 ,2 , / /r i g h tf a c e 0 ,4 ,1 , / /b a c kf a c e 4 ,0 ,3 / /l e f tf a c e } ; / /T r a n s f e rt h ea r r a y st ov e r t e x b u f f e r ,c o l o r b u f f e ra n di n d e x b u f f e r . / /D r a wt h ep r i m i t i v e s( t r i a n g l e )f r o mt h ei n d e xb u f f e r
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
5/22
3/11/2014
In order to produce the grid-aligned pixels for the display, the rasterizer of the graphics rendering pipeline, as its name implied, takes each input primitive and perform raster-scan to produce a set of grid-aligned fragments enclosed within the primitive. A fragment is 3dimensional, with a (x, y, z) position. The (x, y) are aligned with the 2D pixel-grid. The z-value (not grid-aligned) denotes its depth. The zvalues are needed to capture the relative depth of various primitives, so that the occluded objects can be discarded (or the alpha channel of transparent objects processed) in the output-merging stage. Fragments are produced via interpolation of the vertices. Hence, a fragment has all the vertex's attributes such as color, fragment-normal and texture coordinates. In modern GPU, vertex processing and fragment processing are programmable. The programs are called vertex shader and fragment shader. (Direct3D uses the term "pixel" for "fragment".)
4. Vertex Processing
4.1 Coordinates Transformation
The process used to produce a 3D scene on the display in Computer Graphics is like taking a photograph with a camera. It involves four transformations: 1. Arrange the objects (or models, or avatar) in the world (Model Transformation or World transformation). 2. Position and orientation the camera (View transformation). 3. Select a camera lens (wide angle, normal or telescopic), adjust the focus length and zoom factor to set the camera's field of view (Projection transformation). 4. Print the photo on a selected area of the paper (Viewport transformation) - in rasterization stage
A transform converts a vertex V from one space (or coordinate system) to another space V'. In computer graphics, transform is carried by multiplying the vector with a transformation matrix, i.e., V' = M V.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
6/22
3/11/2014
Each object (or model or avatar) in a 3D scene is typically drawn in its own coordinate system, known as its model space (or local space, or object space). As we assemble the objects, we need to transform the vertices from their local spaces to the world space, which is common to all the objects. This is known as the world transform. The world transform consists of a series of scaling (scale the object to match the dimensions of the world), rotation (align the axes), and translation (move the origin). Rotation and scaling belong to a class of transformation called linear transformation (by definition, a linear transformation preserves vector addition and scalar multiplication). Linear transform and translation form the so-called affine transformation. Under an affine transformation, a straight line remains a straight line and ratios of distances between points are preserved. In OpenGL, a vertex V at (x, y, z) is represented as a 3x1 column vector:
Scaling
3D scaling can be represented in a 3x3 matrix:
where x, y and z represent the scaling factors in x, y and z direction, respectively. If all the factors are the same, it is called uniform scaling. We can obtain the transformed result V' of vertex V via matrix multiplication, as follows:
Rotation
3D rotation operates about an axis of rotation (2D rotation operates about a center of rotation). 3D Rotations about the x, y and z axes for an angle (measured in counter-clockwise manner) can be represented in the following 3x3 matrices:
The rotational angles about x, y and z axes, denoted as x, y and z, are known as Euler angles , which can be used to specify any arbitrary orientation of an object. The combined transform is called Euler transform. [TODO] Link to Proof and illustration
Translation
Translation does not belong to linear transform, but can be modeled via a vector addition, as follows:
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
7/22
3/11/2014
Fortunately, we can represent translation using a 4x4 matrices and obtain the transformed result via matrix multiplication, if the vertices are represented in the so-called 4-component homogeneous coordinates (x, y, z, 1), with an additional forth w-component of 1. We shall describe the significance of the w-component later in projection transform. In general, if the w-component is not equal to 1, then (x, y, z, w) corresponds to Cartesian coordinates of (x/w, y/w, z/w). If w=0, it represents a vector, instead of a point (or vertex). Using the 4-component homogeneous coordinates, translation can be represented in a 4x4 matrix, as follows:
The transformed vertex V' can again be computed via matrix multiplication:
Successive Transforms
A series of successive affine transforms (T1, T2, T3, ...) operating on a vertex V can be computed via concatenated matrix multiplications V' = ...T3T2T1V. The matrices can be combined before applying to the vertex because matrix multiplication is associative, i.e., T3 (T2 (T1 V) ) = ( T3T2T1 ) V.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 8/22
3/11/2014
Example
[TODO]
Transformation of Vertex-Normal
Recall that a vector has a vertex-normal, in addition to (x, y, z) position and color. Suppose that M is a transform matrix, it can be applied to vertex-normal only if the transforms does not include non-uniform scaling. Otherwise, the transformed normal will not be orthogonal to the surface. For non-uniform scaling, we could use (M-1)T as the transform matrix, which ensure that the transformed normal remains orthogonal. [TODO] Diagram and more [TODO] Link to Proof
OpenGL
In OpenGL, we can use the GLU function g l u L o o k A t ( )to position the camera:
v o i dg l u L o o k A t ( G L d o u b l ex E y e ,G L d o u b l ey E y e ,G L d o u b l ez E y e , G L d o u b l ex A t ,G L d o u b l ey A t ,G L d o u b l ez A t , G L d o u b l ex U p ,G L d o u b l ey U p ,G L d o u b l ez U p )
That is, the camera is positioned at the origin (0, 0, 0), aimed into the screen (negative z-axis), and faced upwards (positive y-axis). To use the default settings, you have to place the objects at negative z-values.
3/11/2014
Model-View Transform
In Computer Graphics, moving the objects relative to a fixed camera (Model transform), and moving the camera relative to a fixed object (View transform) produce the same image, and therefore are equivalent. OpenGL, therefore, manages the Model transform and View transform in the same manner on a so-called Model-View matrix. Projection transformation (in the next section) is managed via a Projection matrix.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
10/22
3/11/2014
The projection with view frustum is known as perspective projection, where objects nearer to the COP (Center of Projection) appear larger than objects further to the COP of the same size. An object outside the view frustum is not visible to the camera. It does not contribute to the final image and shall be discarded to improve the performance. This is known as view-frustum culling. If an object partially overlaps with the view frustum, it will be clipped in the later stage.
OpenGL
In OpenGL, there are two functions for choosing the perspective projection and setting its clipping volume: 1. More commonly-used GLU function g l u P e r s p e c t i v e ( ) :
v o i dg l u P e r s p e c t i v e ( G L d o u b l ef o v y ,G L d o u b l ea s p e c t R a t i o ,G L d o u b l ez N e a r ,G L d o u b l ez F a r ) / /f o v yi st h ea n g l eb e t w e e nt h eb o t t o ma n dt o po ft h ep r o j e c t o r s ; / /a s p e c t R a t i oi st h er a t i oo fw i d t ha n dh e i g h to ft h ef r o n t( a n da l s ob a c k )c l i p p i n gp l a n e ; / /z N e a ra n dz F a rs p e c i f yt h ef r o n ta n db a c kc l i p p i n gp l a n e s .
2. Core GL function g l F r u s t u m ( ) :
v o i dg l F r u s t u m ( G L d o u b l ex L e f t ,G L d o u b l ex R i g h t ,G L d o u b l ey B o t t o m ,G L d o u b l ey T o p ,G L d o u b l ez N e a r ,G L d o u b l ez F a r ) / /x L e f t ,x R i g h t ,y B o t t o ma n dy T o ps p e c i f i e st h ef r o n tc l i p p i n gp l a n e . / /z N e a ra n dz F a rs p e c i f yt h ep o s i t i o n so ft h ef r o n ta n db a c kc l i p p i n gp l a n e s .
Clipping-Volume Cuboid
Next, we shall apply a so-called projection matrix to transform the view-frustum into a axis-aligned cuboid clipping-volume of 2x2x1 centered on the near plane, as illustrated. The near plane has z=0, whereas the far plane has z=-1. The planes have dimension of 2x2, with range from -1 to +1.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
11/22
3/11/2014
Take note that the last row of the matrix is no longer [0 0 0 1]. With input vertex of (x, y, z, 1), the resultant w-component would not be 1. We need to normalize the resultant homogeneous coordinates (x, y, z, w) to (x/w, y/w, z/w, 1) to obtain position in 3D space. (It is amazing that homogeneous coordinates can be used for translation, as well as the perspective projection.) [TODO] Link to Proof The final step is to flip the z-axis, so that the near plane is still located at z=0, but the far plane is flipped and located at z=1 (instead of z=-1). In other words, the larger the z, the further is the object. To perform flipping, we can simply negate the third row of the projection matrix.
After the flip, the coordinate system is no longer a Right-Hand System (RHS), but becomes a Left-hand System (LHS). [TODO] Link to Proof
We can save the value of the currently selected matrix onto the stack and restore it back via:
v o i dg l P u s h M a t r i x ( ) v o i dg l P o p M a t r i x ( )
Push and pop use a stack and operate in a last-in-first-out manner, and can be nested.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
12/22
3/11/2014
OpenGL
In OpenGL, we can use g l O r t h o ( )function to choose the orthographic projection mode and specify its clipping volume:
v o i dg l O r t h o ( G L d o u b l ex L e f t ,G L d o u b l ex R i g h t ,G L d o u b l ey B o t t o m ,G L d o u b l ey T o p ,G L d o u b l ez N e a r ,G L d o u b l ez F a r )
For 2D graphics, we can use g l u O r t h o 2 D ( )(GLU function instead of GL) to choose 2D orthographic projection and set its clipping area:
v o i dg l u O r t h o 2 D ( G L d o u b l ex L e f t ,G L d o u b l ex R i g h t ,G L d o u b l ey B o t t o m ,G L d o u b l ey T o p )
The default 3D projection in OpenGL is the orthographic (instead of perspective) with parameters (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0), i.e., a cube with sides of 2.0, centered at origin. [TODO] Transform matrix
5. Rasterization
In the previous vertex processing stage, the vertices, which is usually represented in a float value, are not necessarily aligned with the pixelgrid of the display. The relationship of vertices, in term of primitives, are also not considered. In this rasterization stage, each primitive (such as triangle, quad, point and line), which is defined by one or more vertices, are raster-scan to obtain a set of fragments enclosed within the primitive. Fragments can be treated as 3D pixels, which are aligned with the pixel-grid. The 2D pixels have a position and a RGB color value. The 3D fragments, which are interpolated from the vertices, have the same set of attributes as the vertices, such as position, color, normal, texture.
The substages of rasterization include viewport transform, clipping, perspective division, back-face culling, and scan conversion. The rasterizer is not programmable, but configurable via the directives.
3/11/2014
Viewport
Viewport is a rectangular display area on the application window, which is measured in screen's coordinates (in pixels, with origin at the top-left corner). A viewport defines the size and shape of the display area to map the projected scene captured by the camera onto the application window. It may or may not occupy the entire screen. In 3D graphics, a viewport is 3-dimensional to support z-ordering, which is needed for situations such as ordering of overlapping windows.
OpenGL
In OpenGL, by default, the viewport is set to cover the entire application window. We can use the g l V i e w p o r t ( )function to choose a smaller area (e.g., for split-screen or multi-screen application).
v o i dg l V i e w p o r t ( G L i n tx T o p L e f t ,G L i n ty T o p L e f t ,G L s i z e iw i d t h ,G L s i z e ih e i g h t )
Viewport Transform
Our final transform, viewport transform, maps the clipping-volume (2x2x1 cuboid) to the 3D viewport, as illustrated.
Viewport transform is made up of a series of reflection (of y-axis), scaling (of x, y and z axes), and translation (of the origin from the center of the near plane of clipping volume to the top-left corner of the 3D viewport). The viewport transform matrix is given by:
3/11/2014
It is important that the aspect ratio of the projection plane is re-configure to match the viewport's aspect ratio, in order not to distort the shapes. In other words, g l V i e w p o r t ( )and g l u P e r p e c t i v e ( ) / g l O r t h o ( )should be issued together. For example,
/ /C a l l b a c kw h e nt h eO p e n G L ' sw i n d o wi sr e s i z e d . v o i dr e s h a p e ( G L s i z e iw i d t h ,G L s i z e ih e i g h t ){ / /G L s i z e if o rn o n n e g a t i v ei n t e g e r i f( h e i g h t= =0 )h e i g h t=1 ; / /T op r e v e n td i v i d eb y0 G L f l o a ta s p e c t=( G L f l o a t ) w i d t h/( G L f l o a t ) h e i g h t ;/ /C o m p u t ea s p e c tr a t i o / /S e tt h ev i e w p o r t( d i s p l a ya r e ao nt h ew i n d o w )t oc o v e rt h ew h o l ea p p l i c a t i o nw i n d o w g l V i e w p o r t ( 0 ,0 ,w i d t h ,h e i g h t ) ; / /A d j u s tt h ea s p e c tr a t i oo fp r o j e c t i o n ' sc l i p p i n gv o l u m et om a t c ht h ev i e w p o r t g l M a t r i x M o d e ( G L _ P R O J E C T I O N ) ; / /S e l e c tP r o j e c t i o nm a t r i x g l L o a d I d e n t i t y ( ) ; / /R e s e tt h eP r o j e c t i o nm a t r i x / /E i t h e r" p e r s p e c t i v ep r o j e c t i o n "o r" o r t h o g r a p h i cp r o j e c t i o n " ,N O Tb o t h / /3 DP e r s p e c t i v eP r o j e c t i o n( f o v y ,a s p e c t ,z N e a r ,z F a r ) ,r e l a t i v et oc a m e r a ' se y ep o s i t i o n g l u P e r s p e c t i v e ( 4 5 . 0 ,a s p e c t ,0 . 1 ,1 0 0 . 0 ) ; / /O R / /3 DO r t h o g r a p h i cP r o j e c t i o n( x L e f t ,x R i g h t ,y B o t t o m ,y T o p ,z N e a r ,z F a r ) , / /r e l a t i v et oc a m e r a ' se y ep o s i t i o n . i f( w i d t h< =h e i g h t ){ g l O r t h o ( 1 . 0 ,1 . 0 ,1 . 0/a s p e c t ,1 . 0/a s p e c t ,1 . 0 ,1 . 0 ) ; / /a s p e c t< =1 }e l s e{ g l O r t h o ( 1 . 0*a s p e c t ,1 . 0*a s p e c t ,1 . 0 ,1 . 0 ,1 . 0 ,1 . 0 ) ; / /a s p e c t>1 } / /R e s e tt h eM o d e l V i e wm a t r i x g l M a t r i x M o d e ( G L _ M O D E L V I E W ) ; g l L o a d I d e n t i t y ( ) ; }
OpenGL
In OpenGL, face culling is disabled by default, and both front-face and back-faces are rendered. We can use function g l C u l l F a c e ( )to specify whether the back-face (G L _ B A C K ) or front-face (G L _ F R O N T ) or both (G L _ F R O N T _ A N D _ B A C K ) shall be culled.
6. Fragment Processing
After rasterization, we have a set of fragments for each primitive. A fragment has a position, which is aligned to the pixel-grid. It has a depth, color, normal and texture coordinates, which are interpolated from the vertices. The fragment processing focuses on the texture and lighting, which has the greatest impact on the quality of the final image. We shall discussed texture and lighting in details in later sections. The operations involved in the fragment processor are: 1. The first operation in fragment processing is texturing. 2. Next, primary and secondary colors are combined, and fog calculation may be applied. 3. The optional scissor test, alpha test, stencil test, and depth-buffer test are carried out, if enabled. 4. Then, the optional blending, dithering, logical operation, and bitmasking may be performed.
7. Output Merging
7.1 Z-Buffer and Hidden-Surface Removal
z-buffer (or depth-buffer) can be used to remove hidden surfaces (surfaces blocked by other surfaces and cannot be seen from the
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 15/22
3/11/2014
camera). The z-buffer of the screen is initialized to 1 (farthest) and color-buffer initialized to the background color. For each fragment (of each primitive) processed, its z-value is checked against the buffer value. If its z-value is smaller than the z-buffer, its color and z-value are copied into the buffer. Otherwise, this fragment is occluded by another object and discarded. The fragments can be processed in any order, in this algorithm.
OpenGL
In OpenGL, to use z-buffer for hidden-surface removal via depth testing, we need to: 1. Request for z-buffer via g l u t I n i t D i s p l a y M o d e ( ) :
g l u t I n i t D i s p l a y M o d e ( G L U T _ R G B A|G L U T _ D O U B L E|G L U T _ D E P T H ) ; / /G L U T _ D E P T Ht or e q u e s tf o rd e p t h b u f f e r
3. Clear the z-buffer (to 1 denoting the farthest) and the color buffer (to the background color):
g l C l e a r ( G L _ C O L O R _ B U F F E R _ B I T|G L _ D E P T H _ B U F F E R _ B I T ) ; / /C l e a rc o l o ra n dd e p t hb u f f e r s
7.2 Alpha-Blending
Hidden-surface removal works only if the front object is totally opaque. In computer graphics, a fragment is not necessarily opaque, and could contain an alpha value specifying its degree of transparency. The alpha is typically normalized to the range of [0, 1], with 0 denotes totally transparent and 1 denotes totally opaque. If the fragment is not totally opaque, then part of its background object could show through, which is known as alpha blending. Alpha-blending and hidden-surface removal are mutually exclusive. The simplest blending equation is as follows: c = scs + (1 - s)cd where cs is the source color, s is the source alpha, cd is the destination (background) color. The 3 color channels RGB are applied independently. For this blending equation, the order of placing the fragment is important. The fragments must be sorted from back-to-front, with the largest z-value processed first. Also, the destination alpha value is not used. There are many other blending equations to achieve different effects.
OpenGL
In OpenGL, to perform alpha blending, we need to enable blending and disable depth-test (which performs hidden-surface removal). For example,
i f( b l e n d i n g E n a b l e d ){ g l E n a b l e ( G L _ B L E N D ) ; / /E n a b l eb l e n d i n g g l D i s a b l e ( G L _ D E P T H _ T E S T ) ; / /N e e dt od i s a b l ed e p t ht e s t i n g }e l s e{ g l D i s a b l e ( G L _ B L E N D ) ; g l E n a b l e ( G L _ D E P T H _ T E S T ) ; }
Suppose that a new object (called source) is to be blended with the existing objects in the color buffer (called destination). The source's color is (Rs, Gs, Bs, As), and the destination's color is (Rd , Gd , Bd , Ad ). The source and destination color values will be weighted with respective to the source blending factor and destination blending factor and combined to produce the resultant value. Each of the RGB components will be computed independently. For example, suppose the source blending factor for G component is p and the destination blending factor for G component is q, the resultant G component is p Gs + q Gd . There are many choices of the blending factors. For example, a popular choice is:
g l B l e n d F u n c ( G L _ S R C _ A L P H A ,G L _ O N E _ M I N U S _ S R C _ A L P H A ) ;
where each component of the source is weighted by source's alpha value (As), and each component of the destination is weighted by 1-As. In this case, if the original color component's value is within [0.0, 1.0], the resultant value is guaranteed to be within this range. The drawback is that the final color depends on the order of rendering if many surfaces are added one after another (because the destination
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 16/22
3/11/2014
where each component of source is weighted by source's alpha value (As), and each component of the destination is weight by 1. The value may overflow/underflow. But the final color does not depends on the order of rendering when many objects are added. Other values for the blending factors include G L _ Z E R O , G L _ O N E , G L _ S R C _ C O L O R , G L _ O N E _ M I N U S _ S R C _ C O L O R , G L _ D S T _ C O L O R , G L _ O N E _ M I N U S _ D S T _ C O L O R , G L _ S R C _ A L P H A , G L _ O N E _ M I N U S _ S R C _ A L P H A , G L _ D S T _ A L P H A , G L _ O N E _ M I N U S _ D S T _ A L P H A , G L _ C O N S T A N T _ C O L O R ,G L _ O N E _ M I N U S _ C O N S T A N T _ C O L O R ,G L _ C O N S T A N T _ A L P H A , and G L _ O N E _ M I N U S _ C O N S T A N T _ A L P H A . The default for source blending factor is G L _ O N E , and the default for destination blending factor is G L _ Z E R O . That is, opaque (totally nontransparent) surfaces. The computations also explain why depth-testing shall be disabled when alpha-blending is enabled. This is because the final color will be determined by blending between source and destination colors for translucent surfaces, instead of relative depth (the color of the nearer surface) for opaque surfaces.
8. Lighting
Lighting refers to the handling of interactions between the light sources and the objects in the 3D scene. Lighting is one of the most important factor in producing a realistic scene. The color that we see in the real world is the result of the interaction between the light sources and the color material surfaces. In other words, three parties are involved: viewer, light sources, and the material. When light (of a certain spectrum) from a light source strikes a surface, some gets absorbed, some is reflected or scattered. The angle of reflection depends on the angle of incidence and the surface normal. The amount of scatterness depends on the smoothness and the material of the surface. The reflected light also spans a certain color spectrum, which depends on the color spectrum of the incident light and the absorption property of the material. The strength of the reflected light depends on the position and distance of the light source and the viewer, as well as the material. The reflected light may strike other surfaces, and some is absorbed and some is reflected again. The color that we perceived about a surface is the reflected light hitting our eye. In a 2D photograph or painting, objects appear to be three-dimensional due to some small variations in colors, known as shades . The are two classes of lighting models: 1. Local illumination: consider only the direct lightings. The color of the surface depends on the reflectance properties of the surface and the direct lightings. 2. Global illumination: in real world, objects received indirect lighting reflected from other objects and the environment. The global illumination model consider indirect lightings reflected from other objects in the scene. Global illumination model is complex and compute intensive.
Diffuse Light
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 17/22
3/11/2014
Diffuse light models distant directional light source (such as the sun light). The reflected light is scattered equally in all directions, and appears the same to all viewers regardless of their positions, i.e., independent of viewer vector V. The strength of incident light depends on the angle between the light source L and the normal N , i.e., the dot product between L and N .
The resultant color can be computed as follows: The strength of the incident light is max(LN , 0). We use the max function to discard the negative number, i.e., the angle is more than 90 degree. Suppose the light source has color s diff , and the fragment has diffusion reflectance of mdiff , the resultant color c is: cdiff = max(LN , 0) s diff mdiff where the RGB component of the color are computed independently.
Specular Light
The reflected light is concentrated along the direction of perfect reflector R. What a viewer sees depends on the angle (cosine) between V and R.
The resultant color due to specular reflection is given by: cspec = max(RV, 0)sh s spec mspec the sh is known as the shininess factor. As sh increases, the light cone becomes narrower (because RV 1), the highlighted spot becomes smaller.
Ambient Light
A constant amount of light applied to every point of the scene. The resultant color is: camb = s amb mamb
Emissive Light
Some surfaces may emit light. The resultant color is cem = mem
Resultant Color
The resultant color is the sum of the contribution in all the four components: cfinal = cdiff + cspec + camb + cem
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 18/22
3/11/2014
Once lighting is enable, color assigned by g l C o l o r ( )are no longer used. Instead, the color depends on the light-material interaction and the viewer's position. You can use g l L i g h t ( )to define a light source (G L _ L I G H T 0to G L _ L I G H T n ):
v o i dg l L i g h t [ i f ] ( G L e n u ml i g h t S o u r c e I D ,G L e n u mp a r a m e t e r N a m e ,t y p ep a r a m e t e r V a l u e ) ; v o i dg l L i g h t [ i f ] v ( G L e n u ml i g h t S o u r c e I D ,G L e n u mp a r a m e t e r N a m e ,t y p e* p a r a m e t e r V a l u e ) ; / /l i g h t S o u r c e I D :I Df o rt h el i g h ts o u r c e ,G L _ L I G H T 0t oG L _ L I G H T n . / /p a r a m e t e r N a m e :s u c ha sG L _ A M B I E N T ,G L _ D I F F U S E ,G L _ S P E C U L A R ,G L _ P O S I T I O N . / /p a r a m e t e r V a l u e :v a l u e so ft h ep a r a m e t e r .
The default for G L _ P O S I T I O Nis (0, 0, 1) relative to camera coordinates, so it is behind the default camera position (0, 0, 0). G L _ L I G H T 0is special, with default value of white (1, 1, 1) for the G L _ A M B I E N T ,G L _ D I F F U S E ,G L _ S P E C U L A Rcomponents. You can enable G L _ L I G H T 0right away by using its default settings. For other light IDs (G L _ L I G H T 1to G L _ L I G H T n ), the default is black (0, 0, 0) for G L _ A M B I E N T ,G L _ D I F F U S E ,G L _ S P E C U L A R .
Material
Similar to light source, a material has reflectivity parameters for specular (G L _ S P E C U L A R ), diffuse (G L _ D I F F U S E ) and ambient (G L _ A M B I E N T ) components (for each of the RGBA color components), which specifies the fraction of light reflected. A surface may also emit light (G L _ E M I S S I O N ). A surface has a shininess parameter (G L _ S H I N I N E S S ) - the higher the value, the more concentration of reflected-light in the small area around the perfect reflector and the surface appears to be shinier. Furthermore, a surface has two faces: front and back, that may have the same or different parameters. You can use g l M a t e r i a l ( ) function to specify these parameters for the front (G L _ F R O N T ), back (G L _ B A C K ), or both (G L _ F R O N T _ A N D _ B A C K ) surfaces. The front face is determined by the surface normal (implicitly defined by the vertices with right-hand rule, or g l N o r m a l ( )function).
v o i dg l M a t e r i a l [ i f ] ( G L e n u mf a c e ,G L e n u mp a r a m e t e r N a m e ,t y p ep a r a m e t e r V a l u e ) v o i dg l M a t e r i a l [ i f ] v ( G L e n u mf a c e ,G L e n u mp a r a m e t e r N a m e ,t y p e* p a r a m e t e r V a l u e s ) / /f a c e :G L _ F R O N T ,G L _ B A C K ,G L _ F R O N T _ A N D _ B A C K . / /p a r a m e t e r N a m e :G L _ D I F F U S E ,G L _ S P E C U L A R ,G L _ A M B I E N T ,G L _ A M B I E N T _ A N D _ D I F F U S E ,G L _ E M I S S I O N ,G L _ S H I N I N E S S .
The default material has a gray surface (under white light), with a small amount of ambient reflection (0.2, 0.2, 0.2, 1.0), high diffuse reflection (0.8, 0.8, 0.8, 1.0), and no specular reflection (0.0, 0.0, 0.0, 1.0).
9. Texture
In computer graphics, we often overlay (or paste or wrap) images, called textures, over the graphical objects to make them realistic. An texture is typically a 2D image. Each element of the texture is called a texel (texture element), similar to pixel (picture element). The 2D texture coordinate (s , t ) is typically normalized to [0.0, 1.0], with origin at the top-left corner, s -axis pointing right and t -axis pointing down. (Need to confirm whether this is true in OpenGL)
3/11/2014
Although the 2D texture coordinates is normalized to [0.0, 1.0], we can configure the behavior if the coordinates are outside the range. The typical solutions are: 1. Clamp the texture coordinates to [0.0, 1.0] and ignore those outside this range. 2. Wrap (or repeat) the texture along the s- or t-axis, or both. You may set to "mirror" mode so that the textures are continuous. In OpenGL, we use function g l T e x P a r a m e t e r ( )to configure the wrapping behavior for the s and t axes (G L _ T E X T U R E _ W R A P _ Sand G L _ T E X T U R E _ W R A P _ T ) individually. Two modes are supported: G L _ R E P E A T(repeat the texture pattern) and G L _ C L A M P(do not repeat, but clamp to 0.0 to 1.0).
g l T e x P a r a m e t e r f ( G L _ T E X T U R E _ 2 D ,G L _ T E X T U R E _ W R A P _ S ,G L _ R E P E A T ) ; / /R e p e a tt h ep a t t e r n g l T e x P a r a m e t e r f ( G L _ T E X T U R E _ 2 D ,G L _ T E X T U R E _ W R A P _ T ,G L _ R E P E A T ) ; g l T e x P a r a m e t e r f ( G L _ T E X T U R E _ 2 D ,G L _ T E X T U R E _ W R A P _ S ,G L _ C L A M P ) ; / /C l a m p e dt o0 . 0o r1 . 0 g l T e x P a r a m e t e r f ( G L _ T E X T U R E _ 2 D ,G L _ T E X T U R E _ W R A P _ T ,G L _ C L A M P ) ;
Magnification
The commonly used methods are: 1. Nearest Point Filtering: the texture color-value of the fragment is taken from the nearest texel. This filter leads to "blockiness" as many fragments are using the same texel. 2. Bilinear Interpolation: the texture color-value of the fragment is formed via bilinear interpolation of the four nearest texels. This yields smoother result.
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
20/22
3/11/2014
Minification
Minification is needed if the resolution of the texture image is larger than the fragment. Again, you can use the "nearest-point sampling" or "bilinear interpolation" methods. However, these sampling methods often to the so-called "aliasing artefact ", due the low sampling frequency compared with the signal. For example, a far-away object in perspective projection will look strange due to its high signal frequency. [TODO] diagarm on aliasing artefact
Minmaping
A better approach for performing minification is called minmaping (miniature maps), where lower resolutions of the texture image are created. For example, suppose the original image is 64x64 (Level 0), we can create lower resolution images at 32x32, 16x16, 8x8, 4x4, 2x2, 1x1. The highest resolution is referred to as level 0; the next is level 1; and so on. We can then use the nearest matched-resolution texture image; or perform linear interpolation between the two nearest matched-resolution texture images.
We can use a single image and ask OpenGL to produce the lower-resolution images via command g l u B u i l d 2 D M i p m a p s ( )(in place of
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 21/22
3/11/2014
g l T e x I m a g e 2 d ( ) ).
i n tg l u B u i l d 2 D M i p m a p s ( G L e n u mt a r g e t ,G L i n ti n t e r n a l F o r m a t ,G L s i z e iw i d t h ,G L s i z e ih e i g h t , G L e n u mi m a g e D a t a F o r m a t ,G L e n u mi m a g e D a t a T y p e ,c o n s tv o i d* i m a g e D a t a )
Furthermore, in perspective projection, the fast texture interpolating scheme may not handle the distortion caused by the perspective projection. The following command can be used to ask the renderer to produce a better texture image, in the expense of processing speed.
g l H i n t ( G L _ P E R S P E C T I V E _ C O R R E C T I O N _ H I N T ,G L _ N I C E S T ) ;
Feedback, comments, corrections, and errata can be sent to Chua Hock-Chuan ([email protected]) | HOME
http://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html
22/22