opengl l07-skybox and terrian

Post on 13-Jan-2015

194 Views

Category:

Software

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

OpenGL L07-Skybox and Terrian

TRANSCRIPT

Mohammad Shaker

mohammadshaker.com

@ZGTRShaker

2014

OpenGL Graphics

L07- SKYBOX&TERRAIN

How to create the Sky?

Skydome and Skybox

Skydome

SkyBox

SkyBox

Just 6 textures!See the code

SkyBox

SkyBox

SkyBox

SkyBox

Now, How to create the ground?!

Terrain

Terrain

Grid

Terrain

Grid Height Map

+

Terrain

Grid

=

Height Map

+

Terrain

+

Colored Terrain

Terrain

Texture 24 bits

+

Colored Terrain

+

Terrain

=

Texture 24 bits

+

3D TerrainColored Terrain

+

Planetside’sTerragen

Planetside’s Terragen

Terrain’s Height Map Representation

Terrain’s Height Map Representation

Terrain, The Code

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

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

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

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

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

Querying Height

Terrain – Querying Height

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

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

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

))

*scaleY

+15;

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

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

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

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

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

Advanced Techniques

Quad Tree for Fast Searching in Big Worlds

Multitexturing

• Just another custom shader!

Detailing

Multitexturing

Ray and Terrain Collision – Binary Tree Search

Using Custom Shaders

top related