最近在学习DX10和HLSL4.0,在学习图形算法和做demo的同时也在构建一个自己的渲染引擎,并且试着融合一下设计模式方面的东西。
首先展示的是简单的水面效果,视频地址:https://vimeo.com/42953251
主要包含如下要素:sky dome, .obj 模型文件转化及导入,mesh grid (水面),海浪动画(multi sin wave), normal map, shadow mapping, reflection, refraction, fresnel effect。这只是初步实现,还有很多待改善,例如更真实的海浪模型,水下光的散射,水面的镜面反射(可以用specular map fake 或者找个好点的normal map等), HDR等
以下是简要介绍实现方法:
水面动画模型参考的是GPU grem1 - chapter1,主要就是在XZ平面生成多个不同方向的sin波形,再将其融合起来。
reflection, refraction的实现是通过render to texture来实现的。reflection就是先将摄像机相对于XZ平面做个镜像,在镜像位置渲染出水平面上的场景(船)。refraction是将水下的物体(鱼)渲染到一张texture上。
fresnel effect的模型可以参考nvidia官网上cg turitual相关内容。
水面的法向量是通过一张normal map获取的。
不同深度的海水颜色是通过近海水颜色和远海水颜色线性插值计算得到。
shadow mapping 技术可以参考dx9中的shadow mapping demo.
sky dome颜色生成类似海水颜色生成方法。
sky dome还添加了多层云层的效果。其实就是在sky dome上使用多层贴图,并以不同的速度播放纹理动画,这样看起来更真实些。
最后生成的渲染效果是将几个texture融合起来,包括back buffer texture, reflection texture, refraction texture, shadow map(depth texture).
Refraction map
Relection map
shadow map
sea + above 3 maps
reference: