CompanyOfHeroes2渲染技术

最后更新于:2022-04-01 11:27:01

文章链接:http://url.cn/OzAQM8 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_57215543a72bc.jpg) 主要讲即时战略游戏CompanyOfHeroes2在冬天环境下的一些渲染技术,文章结合硬件以及游戏的实际情况,在每一种方法背后,还列出思考和尝试的过程,很实战的一篇。 **物件上的积雪** **积雪** relic试图做geometry上的积累,但是这个要达到好的效果,就需要有一个很好的积雪边缘fading的效果,这个要做好,就需要offline工具来生成这些边缘和normal的信息。 并且需要在shader里面产生geometry,并且有很多例外,所以最后relic放弃了这个做法。 进而relic结合了company of heroes的特点,2.5d的上帝视角,所以其实做了geometry积累也没有那么大的意义,转而来让雪可以在color上fade掉就可以: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_57215543c9c79.jpg) 那这个就容易太多了,在vertex shader里面计算出要积雪的distance,在pixel shader里面fade out即可。 **snow shadow map** 让最上面的地方才有积雪,这个用一个低精度的类似shadow map即可得到occlusion信息,潮湿什么的都可以这么做。 另外这个shadow map可以进行一些扩展,记录min/max height, relic使用这个做了边缘fade out的改进,使得效果更加的自然。 **地形上的雪** 地形上的雪是额外的一层,不属于地形标准层的一部分。 自己可以有高度。 dx11上面使用tesselation来提升效果。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_57215543e31a5.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_5721554413f20.jpg) 车辆在雪地上的痕迹通过一个track map来描述,dx11就是用tessellation来生成geometry,dx10(dx9已经去死了)上面只是normal变下。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_572155442c9eb.jpg) **冰** ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_572155444883a.jpg) 这里着实让我兴奋了下: 冰使用类似地形的多层材质的方法来渲染,这样冰的破损,再冻回来都可以有一个很好的表示,realtime时候的做法就和编辑地形材质一样,在material mask上面修改即可。 但是冰的破损如果只是这样,边缘就太润滑了,而且mask精度低的话,还会有明显的“格子”感,这里relic使用类似shadow中poisson filter的方法,使用一个贴图扰动uv,来达成碎冰状的感觉: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_5721554462931.jpg) **volume ambient occlusion** 这里也展示了relic良好的技术结合产品的综合能力。 - 雪地场景的ao是格外的重要----场景颜色简单,偏白色(简直就是展示ao的专用场景么) - rts游戏没有必要做到那么精细的ao - 重用snow shadow map来产生ao,而且这个ao是volume based,而不是screen space这种在理论上还是有不少信息缺失的情况 效果不俗: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-28_5721554486a74.jpg) **其他** **暴风雪的优化**: 使用1/4 buffer,可以大幅度提高性能 **deferred shading**: 和之前在本博客提到的多个地方也比较一致,deferred shading如果只是认为为多光源而生就太不到位了,它很好的简化了渲染pipeline,把geometry&material信息与shading分开,提升了整个pipeline的结构。 如果pipeline复杂到一定程度,那么选择deferred shading就是非常必要的了
';