Click here to Skip to main content
14,578,796 members

Basic Illumination Model in C#

Rate this:
4.87 (24 votes)
Please Sign up or sign in to vote.
4.87 (24 votes)
15 Jul 2016GPL3
Basic illumination model in C#.

Screenshot - Ambient.png


Screenshot - Diffuse.png


Screenshot - Specular.png


Screenshot - Ambient+Diffuse.png


Screenshot - Diffuse+Specular


Screenshot - Ambient+Diffuse+Specular



In my previous article Simple Ray Tracing in C#, we saw how to display spheres using a simple ray tracing algorithm. Now, we will start from the last point and will work with basic illumination models.

By definition, we have three types of light:

  • Ambient
  • Diffuse
  • Specular


It is considered as the light distributed by the environment, which contributes to the global illumination independent of the light position, objects, or observer.


It is the light the contribution of which depends on its incidence angle. Diffuse light hit can be reflected in all directions.


Specular lights represent the bright spots in objects; the more reflective it is the smaller the bright spot.


To proceed with an illumination algorithm, we need to get the ambient, diffuse, and specular constants for the material we want to model; for example, here we use brass constants which are:

K Ambient Diffuse Specular
RED 0.329412 0.780392 0.992157
GREEN 0.223529 0.568627 0.941176
BLUE 0.027451 0.113725 0.807843

Exponent 27.8974

The ray tracing algorithm used is the same as you can see on Simple Ray Tracing in C# with the improvements of a basic illumination model.

The Equations

A Light Source is defined as an R3 (x,y,z) point with a (vx,vy,vz) direction vector.

An Observer is defined as an R3 (x,y,z) point with a (vx,vy,vz) direction vector.

Theta is defined as the angle between a light ray and a normal vector at the intersection point P on the surface.

Phi is defined as the angle between the reflected light ray at the intersection point P on the surface and the viewer ray to the same point P.

The Sphere Equation

  • r2 = (x-cx)2+(y-cy)2+(z-cz)2

Illumination on a given pixel:

  • IAmbient = I * KAmbient
  • IDiffuse = I * KDiffuse * cos(theta)
  • ISpecular = I * KSpecular * cos(phi)n
  • I = IAmbient + IDiffuse + ISpecular

Reflection calculation:

  • i' = i - (2 * n * dot(i, n))


  • i = incidence light ray
  • n = normal at intersection
  • i' = reflected ray

The Code

if (spherehit != null)
     double intersx  = px + t * vx, intersy = py + t * vy,
                       intersz = pz + t * vz;
     double vNormalX = intersx -,
                       vNormalY=intersy -,
                       vNormalZ=intersz -;
     double cost     = tAlgebra.GetCosAngleV1V2(lvx, lvy, lvz, vNormalX,
                       vNormalY, vNormalZ);
     if (cost < 0) cost = 0;

     double vReflX = 0, vReflY = 0, vReflZ = 0;
     double vEye2IntersX = px - intersx, vEye2IntersY = py - intersy,
                           vEye2IntersZ = pz - intersz;

     tAlgebra.Reflect(lvx,lvy,lvz, vNormalX,vNormalY,vNormalZ,ref vReflX,
                      ref vReflY, ref vReflZ);
     double cosf = tAlgebra.GetCosAngleV1V2(vReflX, vReflY, vReflZ,
                   vEye2IntersX, vEye2IntersY, vEye2IntersZ);
     if (cosf < 0) cosf = 0;

     double result1 = cost * 255.0;
     double result2 = Math.Pow(cosf, spherehit.shininess) * 255.0;
     double rgbR = (spherehit.ambientR * 255.0)+(spherehit.diffuseR *
                    result1) + (spherehit.specularR * result2);
     double rgbG = (spherehit.ambientG * 255.0) +(spherehit.diffuseG *
                    result1) + spherehit.specularG * result2);
     double rgbB = (spherehit.ambientB * 255.0) +(spherehit.diffuseB *
                    result1) + (spherehit.specularB * result2);
     rgbR = Math.Min(rgbR, 255);
     rgbG = Math.Min(rgbG, 255);
     rgbB = Math.Min(rgbB, 255);
     color = Color.FromArgb((int)rgbR, (int)rgbG, (int)rgbB);


This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


About the Author

Brazil Brazil
Senior Analyst

Linkedin Profile

Comments and Discussions

QuestionHi andalmeida! about getcoordinate() function Pin
Isawyouoo11-Sep-17 1:19
MemberIsawyouoo11-Sep-17 1:19 
QuestionSurprised... Pin
0x01AA29-Apr-17 3:36
mve0x01AA29-Apr-17 3:36 
QuestionHow can I do this on my project? Pin
Umut Comlekcioglu16-Aug-13 5:35
professionalUmut Comlekcioglu16-Aug-13 5:35 
AnswerRe: How can I do this on my project? Pin
andalmeida21-Aug-13 8:14
Memberandalmeida21-Aug-13 8:14 
GeneralRe: How can I do this on my project? Pin
Umut Comlekcioglu21-Aug-13 8:58
professionalUmut Comlekcioglu21-Aug-13 8:58 
GeneralRe: How can I do this on my project? Pin
andalmeida21-Aug-13 9:03
Memberandalmeida21-Aug-13 9:03 
GeneralRe: How can I do this on my project? Pin
Umut Comlekcioglu21-Aug-13 9:29
professionalUmut Comlekcioglu21-Aug-13 9:29 
GeneralRe: How can I do this on my project? Pin
andalmeida21-Aug-13 9:06
Memberandalmeida21-Aug-13 9:06 
GeneralRe: How can I do this on my project? Pin
Umut Comlekcioglu21-Aug-13 9:16
professionalUmut Comlekcioglu21-Aug-13 9:16 
GeneralRe: How can I do this on my project? Pin
andalmeida21-Aug-13 9:19
Memberandalmeida21-Aug-13 9:19 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey26-Feb-12 21:16
professionalManoj Kumar Choubey26-Feb-12 21:16 
GeneralLast article on Raytracing Pin
andalmeida29-Apr-09 2:03
Memberandalmeida29-Apr-09 2:03 
GeneralSpecular Highlight [modified] Pin
efi_germany3-Aug-07 8:43
Memberefi_germany3-Aug-07 8:43 
GeneralRe: Specular Highlight Pin
andalmeida3-Aug-07 9:01
Memberandalmeida3-Aug-07 9:01 
GeneralRe: Specular Highlight Pin
efi_germany3-Aug-07 9:24
Memberefi_germany3-Aug-07 9:24 
GeneralRe: Specular Highlight Pin
andalmeida3-Aug-07 11:38
Memberandalmeida3-Aug-07 11:38 
GeneralRe: Specular Highlight Pin
andalmeida10-Aug-07 5:34
Memberandalmeida10-Aug-07 5:34 
Generalnice one Pin
Amar Chaudhary26-Jul-07 13:45
MemberAmar Chaudhary26-Jul-07 13:45 
GeneralRe: nice one Pin
andalmeida29-Jul-07 3:57
Memberandalmeida29-Jul-07 3:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Posted 26 Jul 2007


81 bookmarked