文明5渲染分析-1树林
dx9下的植被渲染
乍一看Geometry里没多少三角形,在屏幕上却渲染出了很多个,而且位置都有很大差异。仔细看下Geometry就能发现起始里面有720个三角形,但这个模型看起来也就16个三角形,剩下的哪去了?
看一下vs
有个treeLocation数组,再看下面红色部分,这是类似骨骼动画的方式来做的。因为视角固定,所以一个VewProjMatrix就够了,每个位置也只要一个Vector4,这么看还是很省寄存器的。虽然这个shader写的用了90个位置,但其实寄存器有256个,用到200多个位置也不是问题,只是这个应用环境下没用那么多。红框内shader是位置变化意思就是
outputPosition = (vertexPosition + treeLocation) * ViewProjMatrix
再看开头的问题,720个三角形分成了位置完全一样的45份(45=720/16)。45刚好是90的一半,一份模型能分成2部分,宽一些的矩形和窄一些的矩形,这俩骨骼索引不同的,每份占2个索引。
再看贴图和渲染结果,虽然每份位置相同,但是uv是不一样的,可以增加丰富程度,这应该就是不用Geometry Instancing API的原因吧。其实这种方法就是GPU Gems2 chapter3 Inside Geometry Instancing中提到的Vertex constants instancing
总结
1,用做骨骼动画的方式实现一次drawcall渲染一块树林,每个树的位置可以动态设置,树片的模型和uv都可以有差异。如果不需要每个树片有差异,则可以使用Geometry Instancing API.
2,因为视角固定,树片都以一个方向面向相机,可以优化为只用一个ViewProjMatrix,且每个treeLocation只占vector4