opengl l07-skybox and terrian

43
Mohammad Shaker mohammadshaker.com @ZGTRShaker 2014 OpenGL Graphics L07- SKYBOX&TERRAIN

Upload: mohammad-shaker

Post on 13-Jan-2015

194 views

Category:

Software


3 download

DESCRIPTION

OpenGL L07-Skybox and Terrian

TRANSCRIPT

Page 1: OpenGL L07-Skybox and Terrian

Mohammad Shaker

mohammadshaker.com

@ZGTRShaker

2014

OpenGL Graphics

L07- SKYBOX&TERRAIN

Page 2: OpenGL L07-Skybox and Terrian

How to create the Sky?

Page 3: OpenGL L07-Skybox and Terrian

Skydome and Skybox

Page 4: OpenGL L07-Skybox and Terrian

Skydome

Page 5: OpenGL L07-Skybox and Terrian

SkyBox

Page 6: OpenGL L07-Skybox and Terrian

SkyBox

Just 6 textures!See the code

Page 7: OpenGL L07-Skybox and Terrian

SkyBox

Page 8: OpenGL L07-Skybox and Terrian

SkyBox

Page 9: OpenGL L07-Skybox and Terrian

SkyBox

Page 10: OpenGL L07-Skybox and Terrian

SkyBox

Page 11: OpenGL L07-Skybox and Terrian

Now, How to create the ground?!

Page 12: OpenGL L07-Skybox and Terrian

Terrain

Page 13: OpenGL L07-Skybox and Terrian

Terrain

Grid

Page 14: OpenGL L07-Skybox and Terrian

Terrain

Grid Height Map

+

Page 15: OpenGL L07-Skybox and Terrian

Terrain

Grid

=

Height Map

+

Page 16: OpenGL L07-Skybox and Terrian

Terrain

+

Colored Terrain

Page 17: OpenGL L07-Skybox and Terrian

Terrain

Texture 24 bits

+

Colored Terrain

+

Page 18: OpenGL L07-Skybox and Terrian

Terrain

=

Texture 24 bits

+

3D TerrainColored Terrain

+

Page 19: OpenGL L07-Skybox and Terrian

Planetside’sTerragen

Page 20: OpenGL L07-Skybox and Terrian

Planetside’s Terragen

Page 21: OpenGL L07-Skybox and Terrian

Terrain’s Height Map Representation

Page 22: OpenGL L07-Skybox and Terrian

Terrain’s Height Map Representation

Page 23: OpenGL L07-Skybox and Terrian

Terrain, The Code

Page 24: OpenGL L07-Skybox and Terrian

Terrain

• #include “texture.h”

• #include “heightMap.h”

• Define

int terraintexture ; // index to terrain texture

GLubyte * HeightData ; // vector (saving heights)

int TerrainSize = 512; // width = height = 512

float step = 1/512.0; // step for texture

• InitGL()terraintexture = LoadTexture("images\\terrain texture.bmp");

HeightData = new GLubyte(TerrainSize*TerrainSize);

HeightData = LoadHeightMap("images\\terrain height.bmp");

Page 25: OpenGL L07-Skybox and Terrian

Terrain – Draw Algorithm

initTerrainPositionX = TerrainSize/2.0f; initTerrainPositionZ = TerrainSize/2.0f; initTerrainPositionY = 0;

glPushMatrix();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D,terraintexture);

glScalef(scaleX,scaleY,scaleZ);

glTranslatef(-initTerrainPositionX, initTerrainPositionY, -initTerrainPositionZ);

for (int i = 3 ; i<TerrainSize-3 ; i++)

{

glBegin(GL_TRIANGLE_STRIP);

for (int j = 3 ; j < TerrainSize -3; j++)

{

glTexCoord2f(j*step,i*step);

glVertex3f(i, GetValue(i,j), j);

glTexCoord2f((j+1)*step,i*step);

glVertex3f(i, GetValue(i,j+1), j+1);

glTexCoord2f(j*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j), j);

glTexCoord2f((j+1)*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j+1), j+1);

}

glEnd();

}

glDisable(GL_TEXTURE_2D);

glPopMatrix();

Page 26: OpenGL L07-Skybox and Terrian

Terrain – Draw Algorithm

initTerrainPositionX = TerrainSize/2.0f; initTerrainPositionZ = TerrainSize/2.0f; initTerrainPositionY = 0;

glPushMatrix();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D,terraintexture);

glScalef(scaleX,scaleY,scaleZ);

glTranslatef(-initTerrainPositionX, initTerrainPositionY, -initTerrainPositionZ);

for (int i = 3 ; i<TerrainSize-3 ; i++)

{

glBegin(GL_TRIANGLE_STRIP);

for (int j = 3 ; j < TerrainSize -3; j++)

{

glTexCoord2f(j*step,i*step);

glVertex3f(i, GetValue(i,j), j);

glTexCoord2f((j+1)*step,i*step);

glVertex3f(i, GetValue(i,j+1), j+1);

glTexCoord2f(j*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j), j);

glTexCoord2f((j+1)*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j+1), j+1);

}

glEnd();

}

glDisable(GL_TEXTURE_2D);

glPopMatrix();

Scale the terrain

Page 27: OpenGL L07-Skybox and Terrian

Terrain – Draw Algorithm

initTerrainPositionX = TerrainSize/2.0f; initTerrainPositionZ = TerrainSize/2.0f; initTerrainPositionY = 0;

glPushMatrix();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D,terraintexture);

glScalef(scaleX,scaleY,scaleZ);

glTranslatef(-initTerrainPositionX, initTerrainPositionY, -initTerrainPositionZ);

for (int i = 3 ; i<TerrainSize-3 ; i++)

{

glBegin(GL_TRIANGLE_STRIP);

for (int j = 3 ; j < TerrainSize -3; j++)

{

glTexCoord2f(j*step,i*step);

glVertex3f(i, GetValue(i,j), j);

glTexCoord2f((j+1)*step,i*step);

glVertex3f(i, GetValue(i,j+1), j+1);

glTexCoord2f(j*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j), j);

glTexCoord2f((j+1)*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j+1), j+1);

}

glEnd();

}

glDisable(GL_TEXTURE_2D);

glPopMatrix();

Translate the terrain

Page 28: OpenGL L07-Skybox and Terrian

Terrain – Draw Algorithm

initTerrainPositionX = TerrainSize/2.0f; initTerrainPositionZ = TerrainSize/2.0f; initTerrainPositionY = 0;

glPushMatrix();

glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D,terraintexture);

glScalef(scaleX,scaleY,scaleZ);

glTranslatef(-initTerrainPositionX, initTerrainPositionY, -initTerrainPositionZ);

for (int i = 3 ; i<TerrainSize-3 ; i++)

{

glBegin(GL_TRIANGLE_STRIP);

for (int j = 3 ; j < TerrainSize -3; j++)

{

glTexCoord2f(j*step,i*step);

glVertex3f(i, GetValue(i,j), j);

glTexCoord2f((j+1)*step,i*step);

glVertex3f(i, GetValue(i,j+1), j+1);

glTexCoord2f(j*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j), j);

glTexCoord2f((j+1)*step,(i+1)*step);

glVertex3f(i+1, GetValue(i+1,j+1), j+1);

}

glEnd();

}

glDisable(GL_TEXTURE_2D);

glPopMatrix();

Drawing the terrain primitives

Page 29: OpenGL L07-Skybox and Terrian

Querying Height

Page 30: OpenGL L07-Skybox and Terrian

Terrain – Querying Height

MyCamera.Position.y = (float)(GetValue(

(int)((MyCamera.Position.x + initTerrainPositionX) * scaleX),

(int)((MyCamera.Position.z + initTerrainPositionZ) * scaleZ)

))

*scaleY

+15;

Page 31: OpenGL L07-Skybox and Terrian

Terrain – Querying Height

MyCamera.Position.y = (float)(GetValue(

(int)((MyCamera.Position.x + initTerrainPositionX) * scaleX),

(int)((MyCamera.Position.z + initTerrainPositionZ) * scaleZ)

))

*scaleY

+15;Getting the correspondent map height

at the camera’s current position

Page 32: OpenGL L07-Skybox and Terrian

Terrain – Querying Height

MyCamera.Position.y = (float)(GetValue(

(int)((MyCamera.Position.x + initTerrainPositionX) * scaleX),

(int)((MyCamera.Position.z + initTerrainPositionZ) * scaleZ)

))

*scaleY

+15;Compensate for any translation on X

and/or Z axis

Page 33: OpenGL L07-Skybox and Terrian

Terrain – Querying Height

MyCamera.Position.y = (float)(GetValue(

(int)((MyCamera.Position.x + initTerrainPositionX) * scaleX),

(int)((MyCamera.Position.z + initTerrainPositionZ) * scaleZ)

))

*scaleY

+15;Scale it by how much you scaled the

terrain on X and Z axis

Page 34: OpenGL L07-Skybox and Terrian

Terrain – Querying Height

MyCamera.Position.y = (float)(GetValue(

(int)((MyCamera.Position.x + initTerrainPositionX) * scaleX),

(int)((MyCamera.Position.z + initTerrainPositionZ) * scaleZ)

))

*scaleY

+15;

And scale the y value in the height map by how much the terrain is Y scaled

Page 35: OpenGL L07-Skybox and Terrian

Terrain – Querying Height

MyCamera.Position.y = (float)(GetValue(

(int)((MyCamera.Position.x + initTerrainPositionX) * scaleX),

(int)((MyCamera.Position.z + initTerrainPositionZ) * scaleZ)

))

*scaleY

+15; And hover above the position a bit

Page 36: OpenGL L07-Skybox and Terrian

Advanced Techniques

Page 37: OpenGL L07-Skybox and Terrian

Quad Tree for Fast Searching in Big Worlds

Page 38: OpenGL L07-Skybox and Terrian

Multitexturing

• Just another custom shader!

Page 39: OpenGL L07-Skybox and Terrian

Detailing

Page 40: OpenGL L07-Skybox and Terrian

Multitexturing

Page 41: OpenGL L07-Skybox and Terrian

Ray and Terrain Collision – Binary Tree Search

Page 42: OpenGL L07-Skybox and Terrian

Using Custom Shaders

Page 43: OpenGL L07-Skybox and Terrian