Skip to content

guyi2000/TerrainEngine

Repository files navigation

Terrain Engine

演示视频

TerrainEngine.mp4

SkyBox

  • 没有使用Cubemap,原因是底面为水,纹理的重复模式不同
  • 绑定一个VAO、VBO、EBO,对五个面进行旋转方法进行绘制
  • 封装为一个类中,完成天空盒的Stretch功能
  • 使用GL_CLAMP_TO_EDGE完成边缘消去

Water wave

  • Water使用新的VAO、VBO、EBO,纹理使用GL_REPEAT重复
  • 通过改变纹理坐标完成水的流动效果

Terrain model

  • 读取heightmap.bmp,注意其为3通道8位灰度图,所以可以间隔取值,并将值映射到高度所在范围
  • heightmap.bmp为分辨率生成verticesindices用于VAO、VBO、EBO
unsigned char* data = stbi_load("data/heightmap.bmp", &width, &height, &nrComponents, 0);
for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
        vertices.push_back((float)j / height);
        vertices.push_back((float)(*(data + 3 * (i * width + j))) / 1500.0f);
        vertices.push_back((float)i / width);
        vertices.push_back((float)j / height);
        vertices.push_back((float)i / width);
    }
}
for (int i = 0; i < height - 1; i++) {
    for (int j = 0; j < width - 1; j++) {
        indices.push_back(i * width + j);
        indices.push_back(i * width + j + 1);
        indices.push_back((i + 1) * width + j);
        indices.push_back(i * width + j + 1);
        indices.push_back((i + 1) * width + j + 1);
        indices.push_back((i + 1) * width + j);
    }
}
  • 纹理坐标映射后,注意此处使用两个纹理,一个是terrain-texture3.bmp另一个是detail.bmp
  • 纹理坐标的混合使用SRC1+SRC2-0.5的形式
  • 由于detail需要重复,因此在片段着色器中将其*10,表示每个方向重复10次

Reflection

  • 反射实现主要是将Water改为半透明,然后重新绘制一个倒的天空盒与Terrain Model
  • 具体可以修改顶点着色器,将y坐标反转并做简单的坐标变换

Interaction

  • 使用camera.hpp完成,同之前作业,增加了UP与DOWN的行为

操作指南

  • W: 前进
  • S: 后退
  • A: 向左
  • D: 向右
  • Space: 上升
  • Q: 下降
  • 鼠标移动:视角变换
  • 鼠标滚轮:放大缩小

About

Terrain Engine by OpenGL

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors