11,935,664 members (61,089 online)
alternative version

50.6K views
76 bookmarked
Posted

# Basic Illumination Model in C#

, 9 Apr 2013 GPL3
 Rate this:
Basic illumination model in C#.
 Ambient Diffuse Specular Ambient+Diffuse Diffuse+Specular Ambient+Diffuse+Specular

## Introduction

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

#### Ambient

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

#### Diffuse

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

#### Specular

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

## Background

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))

where

• 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 - spherehit.cx,
vNormalY=intersy - spherehit.cy,
vNormalZ=intersz - spherehit.cz;
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);
...
}
...```

## Share

 Engineer IBM Brazil
Senior Analyst

Founder of TIHunter Vagas de TI

## You may also be interested in...

 First Prev Next
 How can I do this on my project? tazugur16-Aug-13 6:35 tazugur 16-Aug-13 6:35
 Re: How can I do this on my project? andalmeida21-Aug-13 9:14 andalmeida 21-Aug-13 9:14
 Re: How can I do this on my project? tazugur21-Aug-13 9:58 tazugur 21-Aug-13 9:58
 Re: How can I do this on my project? andalmeida21-Aug-13 10:03 andalmeida 21-Aug-13 10:03
 Re: How can I do this on my project? tazugur21-Aug-13 10:29 tazugur 21-Aug-13 10:29
 Re: How can I do this on my project? andalmeida21-Aug-13 10:06 andalmeida 21-Aug-13 10:06
 Re: How can I do this on my project? tazugur21-Aug-13 10:16 tazugur 21-Aug-13 10:16
 Re: How can I do this on my project? andalmeida21-Aug-13 10:19 andalmeida 21-Aug-13 10:19
 My vote of 5 manoj kumar choubey26-Feb-12 22:16 manoj kumar choubey 26-Feb-12 22:16
 Last article on Raytracing andalmeida29-Apr-09 3:03 andalmeida 29-Apr-09 3:03
 Specular Highlight [modified] efi_germany3-Aug-07 9:43 efi_germany 3-Aug-07 9:43
 Hi. I didn't dive into the article and sample project too deep, but from my first glance at the provided images I wondered why the specular lighting is not (or seems not to be) related to the direction of the light in any way. On the screenshot it looks like the bright highlight is caused directly by the camera. If the light comes from aside, the highlight cannot be in the center of the sphere's visible area. And imagine a scene similar to a solar eclipse: The light is behind the sphere - no specular highlight at all would be visible. Anyways it's nice to have some CG topics covered here!
 Re: Specular Highlight andalmeida3-Aug-07 10:01 andalmeida 3-Aug-07 10:01
 Re: Specular Highlight efi_germany3-Aug-07 10:24 efi_germany 3-Aug-07 10:24
 Re: Specular Highlight andalmeida3-Aug-07 12:38 andalmeida 3-Aug-07 12:38
 Re: Specular Highlight andalmeida10-Aug-07 6:34 andalmeida 10-Aug-07 6:34
 nice one Amar Chaudhary26-Jul-07 14:45 Amar Chaudhary 26-Jul-07 14:45
 Re: nice one andalmeida29-Jul-07 4:57 andalmeida 29-Jul-07 4:57
 Last Visit: 31-Dec-99 19:00     Last Update: 1-Dec-15 17:36 Refresh 1