175

Click here to load reader

XNA L07–Skybox and Terrain

Embed Size (px)

Citation preview

Page 1: XNA L07–Skybox and Terrain

Mohammad Shakermohammadshaker.com

@ZGTRShaker2011, 2012, 2013, 2014

XNA Game DevelopmentL07 – Skybox and Terrian

Page 2: XNA L07–Skybox and Terrain

SkyBox

• Advanced SkyBoxes

– With Terrain

• Riemers web site

– http://www.riemers.net/eng/Tutorials/XNA/Csharp/series4.php

– Rbwhitaker web site

• http://rbwhitaker.wikidot.com/skyboxes-1

Page 3: XNA L07–Skybox and Terrain

SkyBox

• How to make a sky?!

Page 4: XNA L07–Skybox and Terrain

Skydome

• Skydome

Page 5: XNA L07–Skybox and Terrain

Skydome

• Skydome

– You’ll use is a conventional 3D model, previously

made in a modeling tool and processed by the

Content Pipeline.

– Handled through XNA’s Model class!

Page 6: XNA L07–Skybox and Terrain

Skydome

• Skydome

– You’ll use is a conventional 3D model, previously

made in a modeling tool and processed by the

Content Pipeline.

– Handled through XNA’s Model class!

Page 7: XNA L07–Skybox and Terrain

Skydome

• Whenever the camera moves, the skybox or skydome should move with the

camera, so the camera always remains in the center of the volume

Page 8: XNA L07–Skybox and Terrain

Skydome

• Skydome

– the sky is created as a hemisphere using only one texture, and is positioned above the scene

– is easy to animate its textures!

Page 9: XNA L07–Skybox and Terrain

Skydome

• Skydome

– the sky is created as a hemisphere using only one texture, and is positioned above the scene

– is easy to animate its textures!

Page 10: XNA L07–Skybox and Terrain

Skydome

• Skydome

– the sky is created as a hemisphere using only one texture, and is positioned above the scene

– is easy to animate its textures!

Page 11: XNA L07–Skybox and Terrain

Skydome

• Skydome

– the sky is created as a hemisphere using only one texture, and is positioned above the scene

– is easy to animate its textures!

Page 12: XNA L07–Skybox and Terrain

Creating skydomeApress, Chapter 13, Skydome approach

Page 13: XNA L07–Skybox and Terrain

Creating skydome

• Loading the skydome “Hemisphere”

public void Load(string modelFileName)

{

model = Content.Load<Model>(GameAssetsPath.MODELS PATH + modelFileName);

}

Page 14: XNA L07–Skybox and Terrain

Creating skydome

• Updating the Sky

public override void Update(GameTime time)

{

BaseCamera camera = cameraManager.ActiveCamera;

// Center the camera in the SkyDome

transformation.Translate = new Vector3(camera.Position.X,

0.0f, camera.Position.Z);

// Rotate the SkyDome slightly

transformation.Rotate += new Vector3(0,

(float)time.ElapsedGameTime.TotalSeconds * 0.5f, 0);

base.Update(time);

}

Page 15: XNA L07–Skybox and Terrain

Creating skydome

• Drawing the Sky

public override void Draw(GameTime time)

{

GraphicsDevice.DepthStencilState = DepthStencilState.None;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

base.Draw(time);

}

Page 16: XNA L07–Skybox and Terrain

Creating skydome

• Drawing the Sky

public override void Draw(GameTime time)

{

GraphicsDevice.DepthStencilState = DepthStencilState.None;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

base.Draw(time);

}

Page 17: XNA L07–Skybox and Terrain

Creating skydome

• Drawing the Sky

public override void Draw(GameTime time)

{

GraphicsDevice.DepthStencilState = DepthStencilState.None;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

base.Draw(time);

}

Page 18: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 19: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 20: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.DepthStencilState = DepthStencilState.None;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

base.Draw(time);

}

Page 21: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 22: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 23: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 24: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 25: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 26: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 27: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 28: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 29: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 30: XNA L07–Skybox and Terrain

Creating skydome

public override void Draw(GameTime time)

{

GraphicsDevice.RenderState.DepthBufferEnable = false;

foreach (ModelMesh modelMesh in model.Meshes)

{

// We are only rendering models with BasicEffect

foreach (BasicEffect basicEffect in modelMesh.Effects)

SetEffectMaterial(basicEffect);

modelMesh.Draw();

}

GraphicsDevice.RenderState.DepthBufferEnable = true;

base.Draw(time);

}

Page 31: XNA L07–Skybox and Terrain

Another way?

Page 32: XNA L07–Skybox and Terrain

SkyBox!

Page 33: XNA L07–Skybox and Terrain

SkyBox

• The camera is always positioned in the center of the sky

• Innovative approach!

– Illusion of Endless Boundaries!

Page 34: XNA L07–Skybox and Terrain

SkyBox

• How to create it?

Page 35: XNA L07–Skybox and Terrain

SkyBox

• Creating the Box

– six faces, each face has a different texture

Page 36: XNA L07–Skybox and Terrain

SkyBox

• Creating the Box

– six faces, each face has a different texture

Page 37: XNA L07–Skybox and Terrain

SkyBox

• Creating the Box

– six faces, each face has a different texture

– only 12 triangles!

Page 38: XNA L07–Skybox and Terrain

SkyBox

• Microsoft Book, Chapter 10

– “Adding Skies and Horizons to Your Levels”

Page 39: XNA L07–Skybox and Terrain

SkyBox

• Loading Textures, Global Scope

Texture2D frontTexture, backTexture, groundTexture,

leftTexture, rightTexture, skyTexture;

Page 40: XNA L07–Skybox and Terrain

SkyBox

• Loading Textures, Global Scope

• LoadContent()

Texture2D frontTexture, backTexture, groundTexture,

leftTexture, rightTexture, skyTexture;

frontTexture = Content.Load<Texture2D>("Images\\front");

backTexture = Content.Load<Texture2D>("Images\\back");

leftTexture = Content.Load<Texture2D>("Images\\left");

rightTexture = Content.Load<Texture2D>("Images\\right");

groundTexture = Content.Load<Texture2D>("Images\\ground2");

skyTexture = Content.Load<Texture2D>("Images\\sky");

Page 41: XNA L07–Skybox and Terrain

SkyBox

• Then drawing 4 textures with? each time we (translate, rotate,... etc)

Page 42: XNA L07–Skybox and Terrain

SkyBox

• Then drawing 4 textures with Transformation each time we (translate, rotate,... etc)

Page 43: XNA L07–Skybox and Terrain

SkyBox

• Then drawing 4 textures with Transformation each time we (translate, rotate,... etc)

Page 44: XNA L07–Skybox and Terrain

SkyBox

Page 45: XNA L07–Skybox and Terrain

SkyBox

Page 46: XNA L07–Skybox and Terrain

SkyBox

Page 47: XNA L07–Skybox and Terrain

SkyBox

Page 48: XNA L07–Skybox and Terrain

SkyBox

Page 49: XNA L07–Skybox and Terrain

SkyBox at rbwhitaker web site

Page 50: XNA L07–Skybox and Terrain

SkyBox at rbwhitaker web site

Page 51: XNA L07–Skybox and Terrain

Where to look for skybox and textures?

• Acquiring SkyBox Textures

– A Google image search for "skybox" will usually give you all sorts of good skyboxes

– .dds file format

– terathon.com

– http://developer.amd.com/archive/gpu/cubemapgen/pages/default.aspx

Page 52: XNA L07–Skybox and Terrain

Terrain

Page 53: XNA L07–Skybox and Terrain
Page 54: XNA L07–Skybox and Terrain

Terrain

• Advanced Terrains

– Rbwhitaker web site

• http://rbwhitaker.wikidot.com/skyboxes-1

– Riemers web site

• http://www.riemers.net/eng/Tutorials/XNA/Csharp/series4.php

• http://www.riemers.net/eng/Tutorials/XNA/Csharp/series1.php

– Innovative games web site

• http://www.innovativegames.net/blog/blog/2009/05/29/xna-game-engine-tutorial-12-introduction-

to-hlsl-and-improved-terrain/

Page 55: XNA L07–Skybox and Terrain

Terrain

– Innovative games Web Site

Page 56: XNA L07–Skybox and Terrain

Terrain

– Innovative games Web Site

Page 57: XNA L07–Skybox and Terrain

Terrain

• Innovative games

• Web Site Terrain with fog!

Page 58: XNA L07–Skybox and Terrain

Terrainhttp://www.packtpub.com/article/environmental-effects

Page 59: XNA L07–Skybox and Terrain

Terrain

• http://www.packtpub.com/article/environmental-effects

Page 60: XNA L07–Skybox and Terrain

Terrain - packtpub

Page 61: XNA L07–Skybox and Terrain

Terrain

– Many ways to create a terrain

• From

– From File “image”

– From File “raw”

• With \ Without

– With Shaders

– Without Shaders

Page 62: XNA L07–Skybox and Terrain

Terrain

• Using Planetside’s Terragen!

– Create your own customized terrain!

– www.planetside.co.uk/terragen/

• Using EarthSculptor

– http://www.earthsculptor.com/

Page 63: XNA L07–Skybox and Terrain

Height map

Page 64: XNA L07–Skybox and Terrain

Planetside’sTerragen

Page 65: XNA L07–Skybox and Terrain

Planetside’sTerragen

Page 66: XNA L07–Skybox and Terrain

Planetside’s Terragen

Page 67: XNA L07–Skybox and Terrain

Planetside’sTerragen

Page 68: XNA L07–Skybox and Terrain

Earth Sculptor

Page 69: XNA L07–Skybox and Terrain

Earth Sculptor

Page 70: XNA L07–Skybox and Terrain

Terrain – Rimer’s,Creating from file “image”

Page 71: XNA L07–Skybox and Terrain

http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Terrain_from_file.php

Terrain – Rimer’s,Creating from file “image”

Page 72: XNA L07–Skybox and Terrain

Terrain - packtpub

• How to do it perfectly?!

Page 73: XNA L07–Skybox and Terrain

Terrain

Chapter 11, Generating a TerrainPage: 227

Page 74: XNA L07–Skybox and Terrain

TerrainTerrain

Page 75: XNA L07–Skybox and Terrain

Terrain

• Height Maps

Page 76: XNA L07–Skybox and Terrain

Terrain

• Height Maps

Page 77: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 78: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 79: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 80: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 81: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 82: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 83: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 84: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 85: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 86: XNA L07–Skybox and Terrain

Terrain

• Creating Terrain Class

Texture2D heightMapTexture = Content.Load<Texture2D>(heightMapFileName);

int heightMapSize = heightMapTexture.Width*heightMapTexture.Height;

heightMap = new Color[heightMapSize];

heightMapTexture.GetData<Color>(heightMap);

this.vertexCountX = heightMapTexture.Width;

this.vertexCountZ = heightMapTexture.Height;

Page 87: XNA L07–Skybox and Terrain

Terrain

• Manipulate through VertexBuffer

Page 88: XNA L07–Skybox and Terrain

Terrain

• Manipulate through VertexBuffer

Page 89: XNA L07–Skybox and Terrain

Terrain

• Manipulate through VertexBuffer

Page 90: XNA L07–Skybox and Terrain

Terrain

private int[] GenerateTerrainIndices()

{

int numIndices = numTriangles * 3;

int[] indices = new int[numIndices];

int indicesCount = 0;

for (int i = 0; i < (vertexCountZ - 1); i++)

{

for (int j = 0; j < (vertexCountX - 1); j++)

{

int index = j + i * vertexCountZ;

// First triangle

indices[indicesCount++] = index;

indices[indicesCount++] = index + 1;

indices[indicesCount++] = index + vertexCountX + 1;

// Second triangle

indices[indicesCount++] = index + vertexCountX + 1;

indices[indicesCount++] = index + vertexCountX;

indices[indicesCount++] = index;

}

}

return indices;

}

Page 91: XNA L07–Skybox and Terrain

Terrain

private int[] GenerateTerrainIndices()

{

int numIndices = numTriangles * 3;

int[] indices = new int[numIndices];

int indicesCount = 0;

for (int i = 0; i < (vertexCountZ - 1); i++)

{

for (int j = 0; j < (vertexCountX - 1); j++)

{

int index = j + i * vertexCountZ;

// First triangle

indices[indicesCount++] = index;

indices[indicesCount++] = index + 1;

indices[indicesCount++] = index + vertexCountX + 1;

// Second triangle

indices[indicesCount++] = index + vertexCountX + 1;

indices[indicesCount++] = index + vertexCountX;

indices[indicesCount++] = index;

}

}

return indices;

}

Page 92: XNA L07–Skybox and Terrain

Terrain

• Generating the Position and Texture Coordinate of the Vertices

for (float i = -halfTerrainDepth; i <= halfTerrainDepth; i += blockScale)

for (float j = -halfTerrainWidth; j <= halfTerrainWidth; j += blockScale)

vertices[vertexCount].Position = new Vector3(j,heightMap[vertexCount].R * heightScale, i);

float terrainWidth = (vertexCountX - 1) * blockScale;

float terrainDepth = (vertexCountZ - 1) * blockScale;

float halfTerrainWidth = terrainWidth * 0.5f;

float halfTerrainDepth = terrainDepth * 0.5f;How to get the “Height” that correspond to each “Color value”?!

Page 93: XNA L07–Skybox and Terrain

for (float i = -halfTerrainDepth; i <= halfTerrainDepth; i += blockScale)

for (float j = -halfTerrainWidth; j <= halfTerrainWidth; j += blockScale)

vertices[vertexCount].Position = new Vector3(j,heightMap[vertexCount].R * heightScale, i);

float terrainWidth = (vertexCountX - 1) * blockScale;

float terrainDepth = (vertexCountZ - 1) * blockScale;

float halfTerrainWidth = terrainWidth * 0.5f;

float halfTerrainDepth = terrainDepth * 0.5f;

Terrain

you’ll simply take the red color component of each color as height for a vertex

Page 94: XNA L07–Skybox and Terrain

Terrain

• Generating the Position and Texture Coordinate of the Vertices

for (float i = -halfTerrainDepth; i <= halfTerrainDepth; i += blockScale)

for (float j = -halfTerrainWidth; j <= halfTerrainWidth; j += blockScale)

vertices[vertexCount].Position = new Vector3(j,heightMap[vertexCount].R * heightScale, i);

float terrainWidth = (vertexCountX - 1) * blockScale;

float terrainDepth = (vertexCountZ - 1) * blockScale;

float halfTerrainWidth = terrainWidth * 0.5f;

float halfTerrainDepth = terrainDepth * 0.5f;

Page 95: XNA L07–Skybox and Terrain

Terrain

• Generating the Position and Texture Coordinate of the Vertices

for (float i = -halfTerrainDepth; i <= halfTerrainDepth; i += blockScale)

for (float j = -halfTerrainWidth; j <= halfTerrainWidth; j += blockScale)

vertices[vertexCount].Position = new Vector3(j,heightMap[vertexCount].R * heightScale, i);

float terrainWidth = (vertexCountX - 1) * blockScale;

float terrainDepth = (vertexCountZ - 1) * blockScale;

float halfTerrainWidth = terrainWidth * 0.5f;

float halfTerrainDepth = terrainDepth * 0.5f;Are we done just yet?

Page 96: XNA L07–Skybox and Terrain

Terrain

• Generating the Position and Texture Coordinate of the Vertices

for (float i = -halfTerrainDepth; i <= halfTerrainDepth; i += blockScale)

for (float j = -halfTerrainWidth; j <= halfTerrainWidth; j += blockScale)

vertices[vertexCount].Position = new Vector3(j,heightMap[vertexCount].R * heightScale, i);

float terrainWidth = (vertexCountX - 1) * blockScale;

float terrainDepth = (vertexCountZ - 1) * blockScale;

float halfTerrainWidth = terrainWidth * 0.5f;

float halfTerrainDepth = terrainDepth * 0.5f;Texturing!

Page 97: XNA L07–Skybox and Terrain

Terrain

• Generating the Position and Texture Coordinate of the Vertices

for (float i = -halfTerrainDepth; i <= halfTerrainDepth; i += blockScale)

for (float j = -halfTerrainWidth; j <= halfTerrainWidth; j += blockScale)

vertices[vertexCount].Position = new Vector3(j,heightMap[vertexCount].R * heightScale, i);

float terrainWidth = (vertexCountX - 1) * blockScale;

float terrainDepth = (vertexCountZ - 1) * blockScale;

float halfTerrainWidth = terrainWidth * 0.5f;

float halfTerrainDepth = terrainDepth * 0.5f;

Each vertex also has a U and V texture coordinate that should vary

between (0, 0) and (1, 1), where (0, 0) corresponds to the top left,

(1, 0) to the top right and (1, 1) to the bottom right of the texture

Page 98: XNA L07–Skybox and Terrain

Terrain

• Texturing

float tu = 0; float tv = 0;

float tuDerivative = 1.0f / (vertexCountX - 1);

float tvDerivative = 1.0f / (vertexCountZ - 1);

Page 99: XNA L07–Skybox and Terrain

Terrain

• Texturing

float tu = 0; float tv = 0;

float tuDerivative = 1.0f / (vertexCountX - 1);

float tvDerivative = 1.0f / (vertexCountZ - 1);

Page 100: XNA L07–Skybox and Terrain

Terrain

• Creating Normals

Page 101: XNA L07–Skybox and Terrain

Multitexturing Techniques

Page 102: XNA L07–Skybox and Terrain

Multitexturing

Page 103: XNA L07–Skybox and Terrain

Advanced Terrain

• Multitexturing

Page 104: XNA L07–Skybox and Terrain

“App1-MultitexturedTerrain”

Advanced Terrain

Page 105: XNA L07–Skybox and Terrain

Advanced Terrain

“App1-MultitexturedTerrain”

Page 106: XNA L07–Skybox and Terrain

Advanced TerrainNormal Mapping Technique

Page 107: XNA L07–Skybox and Terrain

Advanced Terrain – Normal Mapping Technique

Page 108: XNA L07–Skybox and Terrain

Advanced Terrain – Normal Mapping Technique

Page 109: XNA L07–Skybox and Terrain

Advanced Terrain – Normal Mapping Technique

Page 110: XNA L07–Skybox and Terrain

Advanced Terrain – Normal Mapping Technique

Using the normal mapping technique, you can add the illusion of small-scale detailsto the terrain’s mesh, without needing to increase the complexity of its mesh

You create this illusion by slightly manipulating the lighting in each pixel of yourterrain. Variations in lighting are created by the deviated normals.

Remember that the amount of lighting falling onto a triangle is determined by thenormals of its vertices.

Page 111: XNA L07–Skybox and Terrain

• Creating the Terrain Effects (Apress, Page 277)

Page 112: XNA L07–Skybox and Terrain
Page 113: XNA L07–Skybox and Terrain
Page 114: XNA L07–Skybox and Terrain
Page 115: XNA L07–Skybox and Terrain
Page 116: XNA L07–Skybox and Terrain

Find this at “App2-MultitexturedNormalMappedTerrain”

Page 117: XNA L07–Skybox and Terrain

Terrain - Querying the Terrain’s Height

Page 118: XNA L07–Skybox and Terrain

Terrain - Querying the Terrain’s Height?

Page 119: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height?

Page 120: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height?

– you first need to calculate this position relative to the terrain’s vertex grid.

– You can do this by subtracting the queried world position from the terrain’s origin position,

making sure to take the terrain’s world translation and rotation into account.

Page 121: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height?

– you first need to calculate this position relative to the terrain’s vertex grid.

– You can do this by subtracting the queried world position from the terrain’s origin position,

making sure to take the terrain’s world translation and rotation into account.

• Then you need to know in which quad of the terrain grid the position you are

querying is located, which you can do by dividing the calculated position (relative

to the terrain) by the terrain’s block scale.

Page 122: XNA L07–Skybox and Terrain

Terrain

• Quad Tree

Page 123: XNA L07–Skybox and Terrain

Terrain

• Quad Tree – The concept

Page 124: XNA L07–Skybox and Terrain

Terrain

• Check out the videos in the appendix

Page 125: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height?

– you first need to calculate this position relative to the terrain’s vertex grid.

– You can do this by subtracting the queried world position from the terrain’s origin position,

making sure to take the terrain’s world translation and rotation into account.

• Then you need to know in which quad of the terrain grid the position you are

querying is located, which you can do by dividing the calculated position (relative

to the terrain) by the terrain’s block scale.

How to get our current

position?!

Page 126: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height?

No Built-in Methods

Page 127: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height?

Creating our own Transformation classYou can store the transformations that are currently set on the

terrain (translate, rotate, and scale) inside the Terrain class, using the Transformation class created in Chapter 10, Apress.

Page 128: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

Page 129: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

// Get the position relative to the terrain grid

Vector2 positionInGrid = new Vector2(

positionX - (StartPosition.X + Transformation.Translate.X),

positionZ - (StartPosition.Y + Transformation.Translate.Z));

// Calculate the grid position

Vector2 blockPosition = new Vector2(

(int)(positionInGrid.X / blockScale),

(int)(positionInGrid.Y / blockScale));

Page 130: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

// Get the position relative to the terrain grid

Vector2 positionInGrid = new Vector2(

positionX - (StartPosition.X + Transformation.Translate.X),

positionZ - (StartPosition.Y + Transformation.Translate.Z));

// Calculate the grid position

Vector2 blockPosition = new Vector2(

(int)(positionInGrid.X / blockScale),

(int)(positionInGrid.Y / blockScale));

Page 131: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

// Get the position relative to the terrain grid

Vector2 positionInGrid = new Vector2(

positionX - (StartPosition.X + Transformation.Translate.X),

positionZ - (StartPosition.Y + Transformation.Translate.Z));

// Calculate the grid position

Vector2 blockPosition = new Vector2(

(int)(positionInGrid.X / blockScale),

(int)(positionInGrid.Y / blockScale));

Page 132: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

// Get the position relative to the terrain grid

Vector2 positionInGrid = new Vector2(

positionX - (StartPosition.X + Transformation.Translate.X),

positionZ - (StartPosition.Y + Transformation.Translate.Z));

// Calculate the grid position

Vector2 blockPosition = new Vector2(

(int)(positionInGrid.X / blockScale),

(int)(positionInGrid.Y / blockScale));

Page 133: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

// Get the position relative to the terrain grid

Vector2 positionInGrid = new Vector2(

positionX - (StartPosition.X + Transformation.Translate.X),

positionZ - (StartPosition.Y + Transformation.Translate.Z));

// Calculate the grid position

Vector2 blockPosition = new Vector2(

(int)(positionInGrid.X / blockScale),

(int)(positionInGrid.Y / blockScale));

Page 134: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

// Get the position relative to the terrain grid

Vector2 positionInGrid = new Vector2(

positionX - (StartPosition.X + Transformation.Translate.X),

positionZ - (StartPosition.Y + Transformation.Translate.Z));

// Calculate the grid position

Vector2 blockPosition = new Vector2(

(int)(positionInGrid.X / blockScale),

(int)(positionInGrid.Y / blockScale));

Page 135: XNA L07–Skybox and Terrain

Terrain

• Querying the Terrain’s Height

// Get the position relative to the terrain grid

Vector2 positionInGrid = new Vector2(

positionX - (StartPosition.X + Transformation.Translate.X),

positionZ - (StartPosition.Y + Transformation.Translate.Z));

// Calculate the grid position

Vector2 blockPosition = new Vector2(

(int)(positionInGrid.X / blockScale),

(int)(positionInGrid.Y / blockScale));

Page 136: XNA L07–Skybox and Terrain

Terrain

• A block in the terrain grid. If the x position inside the block is bigger than the z

position, the object is in the top triangle. Otherwise, the object is in the bottom

triangle.

Page 137: XNA L07–Skybox and Terrain

Terrain

• After finding in which triangle the object is positioned, you can obtain the height

of a position inside this triangle through a bilinear interpolation of the height of

the triangle’s vertices.

• Use the following code for the GetHeight method to calculate the height of a

terrain’s position

private float GetHeight(float positionX, float positionZ)

Page 138: XNA L07–Skybox and Terrain

Advanced TerrainRay and Terrain Collision

Page 139: XNA L07–Skybox and Terrain

Advanced Terrain - Ray and Terrain Collision

Page 140: XNA L07–Skybox and Terrain

Advanced Terrain - Ray and Terrain Collision

Page 141: XNA L07–Skybox and Terrain

Advanced Terrain - Ray and Terrain Collision

• Quite Straight forward

// A good ray step is half of the blockScale

Vector3 rayStep = ray.Direction * blockScale * 0.5f;

Vector3 rayStartPosition = ray.Position;

// Linear search - Loop until you find a point inside and outside the terrain

Vector3 lastRayPosition = ray.Position;

ray.Position += rayStep;

float height = GetHeight(ray.Position);

while (ray.Position.Y > height && height >= 0)

{

lastRayPosition = ray.Position;

ray.Position += rayStep;

height = GetHeight(ray.Position);

}

Page 142: XNA L07–Skybox and Terrain

Terrain

• Chapter 25: Terrain with Height Detection

• From “.raw” file

Page 143: XNA L07–Skybox and Terrain

Terrain - packtpub

• How to do it perfectly?!

Page 144: XNA L07–Skybox and Terrain

Terrain - packtpub

• Read the Height map and convert it to a proper array

Page 145: XNA L07–Skybox and Terrain

Terrain - packtpub

• How to get the Heights?!

Color[] heightMapData = new Color[width * length];heightMap.GetData<Color>(heightMapData);

Page 146: XNA L07–Skybox and Terrain

Terrain - packtpub

• How to get the Heights?!

Color[] heightMapData = new Color[width * length];heightMap.GetData<Color>(heightMapData);

Page 147: XNA L07–Skybox and Terrain

Terrain - packtpub

heights[,]

Page 148: XNA L07–Skybox and Terrain

Terrain - packtpub

• Read the Height map and convert it to a proper array?!

Page 149: XNA L07–Skybox and Terrain

Terrain - packtpub

• Read the Height map and convert it to a proper array?!

Page 150: XNA L07–Skybox and Terrain

Terrain - packtpub

• Read the Height map and convert it to a proper array?!

Page 151: XNA L07–Skybox and Terrain

Terrain

• The demonstration used in this chapter shows how to create and implement a

height map using an 8-bit “.raw” grayscale image.

• Each pixel in the.raw image stores information about the elevation in a range

between 0 and 255.

• the height data in each pixel can then be accessed with the pixel row and column

number!

Page 152: XNA L07–Skybox and Terrain

Terrain

• Proper texture covers your terrain,

• Original terrain created is 257 pixels wide by 257 pixels high

floorTexture = Content.Load<Texture2D>("Images\\terrain");

const int NUM_COLS = 257;

const int NUM_ROWS = 257;

Page 153: XNA L07–Skybox and Terrain

Terrain

• The vertex buffer used for storing the terrain vertices must now use the height

information from the height map.

InitializeVertexBuffer() // for NUM_COLS, NUM_ROWS

Page 154: XNA L07–Skybox and Terrain

Terrain

• Controlling Height!

void UpdateCameraHeight()

{

const float HOVER_AMOUNT = 0.25f;

float height = CellHeight(cam.position);

cam.view.Y += height - cam.position.Y + HOVER_AMOUNT;

cam.position.Y += height - cam.position.Y + HOVER_AMOUNT;

}

Page 155: XNA L07–Skybox and Terrain

Terrain

• Controlling Height!

void UpdateCameraHeight()

{

const float HOVER_AMOUNT = 0.25f;

float height = CellHeight(cam.position);

cam.view.Y += height - cam.position.Y + HOVER_AMOUNT;

cam.position.Y += height - cam.position.Y + HOVER_AMOUNT;

}

Page 156: XNA L07–Skybox and Terrain

Terrain

• How to know the current HoverAmount?!

Page 157: XNA L07–Skybox and Terrain

Terrain

• How to know the current HoverAmount?!

Page 158: XNA L07–Skybox and Terrain

Terrain

• How to know the current HoverAmount?!

Page 159: XNA L07–Skybox and Terrain

Terrain – Back to our awesome terrain

• http://www.packtpub.com/article/environmental-effects

Page 160: XNA L07–Skybox and Terrain

Advanced Terrain - Multitexturing

Page 161: XNA L07–Skybox and Terrain

Advanced Terrain – Multitexturing / packtpub

• Just another custom shader!

Page 162: XNA L07–Skybox and Terrain

Advanced Terrain – Spice it Up!

Page 163: XNA L07–Skybox and Terrain

Advanced Terrain – Spice it Up!Adding a detail texture

to the terrain

Page 164: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

• Snow Texture!

Page 165: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

Page 166: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

• Details appear when camera is close to the terrain to fake a higher resolution

texture

Page 167: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

Page 168: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

Page 169: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

• How to add all these tress and bushes!

– Code?!!!!! :@

– XML

Page 170: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

Page 171: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

• Clouds! \ Billboarding!

Page 172: XNA L07–Skybox and Terrain

Advanced Terrain –Detailing / packtpub

Page 173: XNA L07–Skybox and Terrain

Advanced Terrain

Page 174: XNA L07–Skybox and Terrain

Advanced Terrain

Page 175: XNA L07–Skybox and Terrain

Advanced Terrain