PS2 Linux Programming

 

Creating Lighting With Specular Highlights

 

 

Introduction

 

In this tutorial Specular Highlights will be illustrated. The lighting calculations necessary will be computed using vector unit 1.

 

 

Background

 

Shiny surface such as polished metal or glossy paint contain highlight or bright spot. Where the bright spot appears on the material is a function of the position and orientation of the surface, the position of the light source and the position of the viewer. This type of reflectance is therefore view-dependent, so unlike ambient and diffuse terms itís computation is based on the position of the camera. The fact that this feature is viewer dependent should come as no surprise, since if you stand in front of a mirror and move from side to side, the position of any light source, such as an eclectic light bulb, is also seen to move position in the mirror. An ideal mirror is a pure specular reflector.

 

At the microscopic level a specular reflecting surface is very smooth, and usually the microscopic surface elements are oriented in the same direction as the surface itself. Specular reflection is merely the mirror reflection of the light source in a surface. In order to model specular reflection we need to understand the physics of reflection.

 

Reflection is a special case of Snell's laws, which state that:

 

 

         The incoming ray, the surface normal, and the reflected ray all lie in a common plane.

         The angle that the reflected ray forms with the surface normal is equal to the angle that the incident ray makes with the surface normal.

 

 

This is illustrated in the diagram below:

 

 

 

 

Snell's law, however, applies only to ideal reflectors. Real materials other than mirrors and chrome tend to deviate significantly from ideal reflectors and it is convenient at this point to introduce an empirical model that is consistent with observations.

 

In general it is expected that most of the reflected light will travel in the direction of the ideal ray. However, because of microscopic surface variations some of the light is expected to be reflected just slightly offset from the ideal reflected ray. As we move further away from the position of the ideal reflected ray (in the angular sense) we expect to see less  of the reflected light. These features are illustrated in the diagrams below:

 

 

 

 

tex2html_wrap612

 

 

One function that approximates this falloff in light intensity is called the Phong Illumination model. This model is purely empirical and has no physical basis, yet it is one of the most commonly used illumination models in computer graphics. Essentially, if the eye is right on the reflection direction, the contribution from the specular component is higher than when the eye direction is farther from the reflection direction. We can also imagine that for a perfect reflector, there will be a quicker fall-off than for a less ideal reflector. We model the speed of that fall-off (and therefore the reflectivity of the surface) with the a shininess factor for the material of the surface. The basis of the calculations are illustrated in the diagram below.

 

 

 

 

 

 

The plots below shows the how the Phong reflectance drops off based on the viewer's angle from the reflected ray for various values of nshiny.

 

 

 

 

We can compute the cosine term of the Phong specular illumination using the following relationship (just like in the diffuse component, we do not wish to compute the cosine of the angle directly):

 

 

 

 

The V vector is the unit vector in the direction of the viewer and the vector R is the ideal mirror reflectance direction. The vector R can be computed from the incoming light direction and the surface normal as shown in the diagram below.

 

 

 

 

Leading to the relationship:

 

 

 

 

Another approach for computing Phong's illumination uses the following equation (Blinn & Torrance Variation):

 

 

 

 

In this equation the angle of specular dispersion (N.H) is computed by how far the surface's normal is from a vector bisecting the incoming light direction and the viewing direction.

 

 

 

 

It is left as an exercise for the reader to consider how this equation and the previous equation differ.

 

 

Example Code

 

In order to perform the lighting calculations the position and colour of the light source and the position of the camera must be passed to VU1 along with the other required data discussed in previous tutorials. This is illustrated in the diagram below:

 

 

 

 

The format of the static part of the packet sent to the VU is illustrated below.

 

 

 

Address

Data

0

Scaling Vector

1

Point Light Colour

2

Point Light Position

3

Camera Position

4

Unused

5

Unused

6

Unused

7

Unused

8

Transformation Matrix Row #0

9

Transformation Matrix Row #1

10

Transformation Matrix Row #2

11

Transformation Matrix Row #3

12

World Matrix Row #0

13

World Matrix Row #1

14

World Matrix Row #2

15

World Matrix Row #3

 

 

                        VU1 Data Memory Layout

 

 

Specular lighting calculations are performed using the following VU code which uses the Blinn & Torrance Variation (note that the complete VU code is included with the downloadable source):

 

 

lq.xyz             Cam, CamPos(vi00)

sub.xyz            Cam, Cam, Vert

VectorNormalizeXYZ Cam, Cam

add.xyz            HalfVec, Cam, ToLight

VectorNormalizeXYZ HalfVec, HalfVec

VectorDotProduct   fSpecIntensity, HalfVec, Norm

mul.x         fSpecIntensity, fSpecIntensity, fSpecIntensity  ; Square it

mul.x         fSpecIntensity, fSpecIntensity, fSpecIntensity  ; 4th power

mul.x         fSpecIntensity, fSpecIntensity, fSpecIntensity  ; 8th power

mul.x         fSpecIntensity, fSpecIntensity, fSpecIntensity  ; 16th power

mul.x         fSpecIntensity, fSpecIntensity, fSpecIntensity  ; 32nd power

add.x         fIntensity, fIntensity, fSpecIntensity          ; Get the total intensity

 

max.x         fIntensity, fIntensity, vf00           ; Clamp to > 0

mini.x        fIntensity, fIntensity, vf00[w]       ; Clamp to < 1

 

lq            fLightCol, LightCol(vi00)              ; Load the light colour

mul.xyz       fLightCol, fLightCol, fIntensity[x]   ; Scale the colour by the intensity

loi           128

mul           fLightCol, fLightCol, i                ; Scale from 0-1 to range 0-127

ftoi0         iLightCol, fLightCol                   ; Convert to ints

sq            iLightCol, NormStartOut(Counter)      ; And write to the output buffer

 

 

In the example application, a flat terrain (with all the vertex normals pointing upwards at right angles to the terrain) is lit by a single point light source with a position that circles round above the terrain. The lighting effect is illustrated in the diagram shown below.

 

 

 

 

Conclusions

 

The calculation of specular highlights using a point light source has been illustrated in this tutorial. There are many variations which are possible and it is left up to the reader to experiment with these lighting models.

 

 

Dr Henry S Fortuna

University of Abertay Dundee

h.s.fortuna@abertay.ac.uk