通常在网络游戏的地表渲染中,都是使用4层纹理混合的方式来实现地表的混合,加上混合层,一共5层纹理。但这样得到的结果通常比较呆板,效果并不佳。如下图所示:
可以看出,如果仅仅使用顶点光照+纹理混合,得到的画面感觉很平,而且能够提供的细节非常少。因此,我们考虑在地表纹理的a通道内增加地表纹理的高度数据。这个数据可以由美术生成,也可以由程序自动生成。不过通常程序自动生成的数据并不精确。有了高度数据,我们就可以做很多事,可以在ps中通过4层纹理的平均高度,以及相邻像素的平均高度来计算法线。然后我们可以将光照计算迁移到ps中来实现。带像素光照的效果如下图所示:
在ps阶段有了像素法线,再通过像素光照计算,得到的效果的确优于顶点光照得到的效果。不过最终渲染出来的效果看起来还是缺乏一些质感,看起来比较别扭。可以考虑在ps阶段增加视差,因为在ps阶段计算光照,那么在ps阶段增加视差就仅仅需要增加一个简单的步骤,就能得到非常好的效果。极大的提升整个画面的品质。如下图所示:
上图可以看出,效果已经得到了极大的改善,砖的渲染效果十分明显。而且对fps的影响有限。不过视差算法会带来一个额外的问题,就是在地表有尖锐突击的地方,会出现分界线。如果用视差剔除算法,可以解决这个问题,而且效果更好。但是,视差剔除的本质是类似于光线追踪,虽然能提升图形的效果,但也极大的降低了帧率。如下图:
POM得到了非常真实的质感,可惜帧率只有20多帧。POM的算法是微软sdk内的算法,其实还是有优化的余地。
测试用的显卡是nvidia 9600 gso