跳转至

GPU Instancing

  • 相同材质,打包发送到显存的常量缓存区,存成数组。减少到一次DrawCall
  • 直接Graphics.DrawInstancedIndirect绘制

草地渲染流程

  • 利用TrailRenderer将自动淡出的运行轨迹渲染到一张RT上面
  • LateUpdate
  • 定义草生成的世界坐标
  • 更新草的信息
    • 生成草范围的中心坐标
    • 包围盒
    • 草地分块
  • 传入shader和ComputeShader分别进行渲染和计算
  • 计算出六个裁剪平面
  • 草地构造Bound,进行AABB碰撞测试
  • 根据草地块索引使用ComputeShader进行裁剪
  • 将裁剪的草数量复制到argsBuffer中
  • 绘制草

剔除工作

Unity在应用阶段有自己的剔除工作(以对象为单位的剔除),而GPU Instancing无法享受到,所以我们必须有自己的剔除

我们主要分为两次剔除 - CPU端的剔除,使用AABB包围盒快速筛选 - ComputeShader的GPU端的剔除

草地广告牌

草的观察矩阵旋转信息实现广告牌效果,再加上其锚点的世界坐标

草地交互

  • 利用TrailRender组件,渲染轨迹到一张RT上
  • 根据RT,计算影响到的草的位置(世界空间-草地中心/除以整个草地宽度)
  • 将影响到的草尖位置下移
  • 风场使草倾倒

风场模拟

三波风浪 - 最后将偏移量叠加到顶点位置即可

光照

光照:half-lambert