opengl l07-skybox and terrian
DESCRIPTION
OpenGL L07-Skybox and TerrianTRANSCRIPT
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