记录一下YCT里GPUDriven 草地渲染实现。
1.静态数据烘焙
使用地形均匀网格Mesh和美术画的草地Mask,生成草地的分布数据。
方法是遍历Mesh的三角形,用三角形UV去采样Mask,如果三个顶点都在Mask上是处于草地分布的,就保留顶点数据到草地分布List里。
2.草地脚本生产GrassInfo
自定义一个GrassInfo的Struct结构,用于上传ComputerShader。
遍历草地分布的三角形,通过插片分布、计算法线、随机旋转的操作,生成具体的GrassInfo数据。
GrassInfo包含草地的transform数据,以及lightmapUV数据。
因为草是依赖地形生成,可以采样地形的ShadowMask,在树和房子下面的草地有阴影效果更好。


3.草地脚本GPU数据上传
GrassInfo数据在生成结束后,上传到CS StructedBuffer里。
GPU上存两份GrassInfo的Buffer,一份是所有的_MatrixBuffer,一份是剔除后的_ValidMatrixBuffer。
4.GPU CS剔除
在GPU上进行视锥剔除。
摄像机的Planes和草的AABB进行测试。填充测试通过的草地数据到Buffer。
5.PreZ Pass
先进行深度绘制,后面可以利用EarlyZ降低很大的Overdraw。
使用DrawIndirect。
6.GPU DrawIndirect
GPU直接绘制草地。
1 | cmd.DrawMeshInstancedIndirect(GrassUtil.unitMesh,0,grassTerrian.material,0,grassTerrian.argsBuffer); |