Tutorial 8 - Simple ShadowsBy Pieter Germishuys, January 4 2006 |
For ultimate realism what better way to produce this then actually implementing shadows. This is definitely not the best method but it's a good hack.
What is a Shadow?
A shadow is a dark shape, e.g. on the ground or a wall, caused by an object (or person, etc.) blocking light.
What do we need to know?
Now that we know what a shadow is, how do we produce one?
Since this is a beginner tutorial I am not going to be using shaders nor am I going to use any difficult tricks.
The theory is simple for this exercise.
1) Create a plane that will define the normal of the object
2) Use the Matrix.Shadow method to create a transformation that will flatten the geometry to a plane.
3) Render your Solid object with a the world matrix
4) Render your Solid object again, this time with the shadow Matrix.
The code
Declaring your objects.
private Box box; private Floor floor; private Plane shadowPlane; private Matrix matShadow; private Matrix matFloor; private Matrix matBox; private Material mtrlBox; private Material mtrlFloor; private Material mtrlShadow; |
The constructor that will initialize our objects and load our mesh.
public Core() { ????window = new Window(); ????//setup our point light ????//enable lighting in our engine ????//I created a simple floor and box class that will just instantiate our box and floor ????//The floor material ????//The plane of the shadow |
private void Update() { ????//set the box at 10 units above the floor ????matBox = Matrix.Translation(0.0f, 10.0f, 0.0f); ????//set the floor 1.0 units lower so that we can see the shadow ????matFloor = Matrix.Translation(0.0f, -1.0f, 0.0f); } |
private void Render() { ????window.BeginRender(Color.Black); ????//Render the floor with the position and material ????window.D3DDevice.Material = mtrlFloor; ????window.D3DDevice.Transform.World = matFloor; ????floor.Render(window.D3DDevice); ????//Render the box with the position and material ????window.D3DDevice.Material = mtrlBox; ????window.D3DDevice.Transform.World = matBox; ????box.Render(window.D3DDevice); ????//Render the shadow box with the position and material ????window.D3DDevice.Material = mtrlShadow; ????window.D3DDevice.Transform.World = matShadow; ????box.Render(window.D3DDevice); ????window.FinishRender(); } |
Files for this tutorial
Filename | Size |
? tut8.rar | 273.0 KB |