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就是非常必要的了