TerrainEngine.mp4
没有使用Cubemap,原因是底面为水,纹理的重复模式不同
绑定一个VAO、VBO、EBO,对五个面进行旋转方法进行绘制
封装为一个类中,完成天空盒的Stretch功能
使用GL_CLAMP_TO_EDGE完成边缘消去
Water使用新的VAO、VBO、EBO,纹理使用GL_REPEAT重复
通过改变纹理坐标完成水的流动效果
读取heightmap.bmp,注意其为3通道8位灰度图,所以可以间隔取值,并将值映射到高度所在范围
以heightmap.bmp为分辨率生成vertices和indices用于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次
反射实现主要是将Water改为半透明,然后重新绘制一个倒的天空盒与Terrain Model
具体可以修改顶点着色器,将y坐标反转并做简单的坐标变换
使用camera.hpp完成,同之前作业,增加了UP与DOWN的行为
W : 前进
S : 后退
A : 向左
D : 向右
Space : 上升
Q : 下降
鼠标移动:视角变换
鼠标滚轮:放大缩小