The final color of the pixel displayed on the screen is given by the following equation:
If = Ia + Id + Is
where If is the intensity of the pixel final color, Ia is the intensity of the ambient color, Id
is the intensity of the diffuse color and Is that of the specular color.
For more explanations on these various components, please refer to the Lighting & Materials
tutorial (soon available).
Ia, Id and Is are all four-dimensional RGBA vectors.
The Ia term is the ambient component. Ia is the result of the multiplication between the ambient component of the light and
that of the material which composes the surface of the 3d object:
Ia = Al * Am
where Al is the ambient component of the light and Am that of the material. Ia is generally a constant RGBA vector,
and this value is the same one independently from the pixel. We will see in another tutorial a more advanced expression of
this ambient term with the technique known as the Ambient Occlusion Lighting.
The Id term expresses the final diffuse component. This component is given by the following equation:
Id = Dl * Dm * LambertTerm
where Dl is the diffuse component of the light and Dm that of the material.
The LambertTerm factor is the keystone of the lighting equations. It is indeed the value of this factor which will make
it possible to create the self shadow of a 3d object (self-shadowing). This Lambert coefficient is calculated with the following dot
product:
LambertTerm = max( N dot L, 0.0)
where N is the normal vector to the considered pixel and L the light vector at the same pixel. This simple relation but
so fundamental, tells us that the value of the Lambert coefficient will be maximum (1.0) if the angle between the two vectors (L and N)
equals zero, i.e. if the pixel is directly in front of the light. For all the other cases, the Lambert coefficient will vary between 0.0
and 1.0 what will generate the self shadow.
The max() function is just there to prevent us from having a negative value for the Lambert term.
Update: March 8, 2006:
The Is term expresses the final specular component. This component is obtained by:
Is = Sm x Sl x pow( max(R dot E, 0.0), f )
The Is term is from far the most complicated to calculate but it is responsible of these famous specular reflections on
the surface of the objects. Sl is the specular component of the light and Sm that of the material. E is the view vector
or camera vector and R is the light L reflected vector in relation to the normal N. R is obtained with:
R = reflect(-L, N)
where N is the normal vector to the pixel considered, L the light vector and reflect() a function
(available in GLSL) which makes it possible to calculate the reflexion vector of L in relation to N. The pow() function is the power
function which makes it possible to raise a number N to the power of p: pow(n, p). f is the specular exponential factor
(the famous shininess in OpenGL) which represents the hardness and the precision of the specular reflection.
These small explanations show us the importance of the N normal vector. In traditional rendering process, the N vector at
the level of a pixel results from the interpolation of the three normal vectors of the three vertices which form the current face of the
3D object. In this case the variations of the N vector are very small on the current face.
The bump mapping technique precisely consists in giving more life and sparkling to this poor N vector by drawing for
each pixel a normal vector from a normal-map. For more details on the normal map, please refer to this tutorial: Normal Maps.
The textures used for this tutorial are the same ones as those of the normal-maps tutorial.