unity-shader-草grass实现


title: unity-shader-草grass实现
categories: Unity3d-Shader
tags: [unity, shader, grass, 草, geometry shader]
date: 2019-05-20 02:37:16
comments: false

unity-shader-草grass实现


前篇


草体结构

多个面片组成草体结构

传统的方式,即将模型数据从CPU传递给GPU,GPU再根据这些数据进行渲染的方式在渲染大规模的草体时,往往会忽略单个草体的模型细节。因为单个草体的建模如果过于细致,则渲染大片的草地就需要传递很多多边形,从而造成性能的下降。
因此,一个渲染大片草地的方案往往需要满足以下条件:

  • 单个草的多边形不能过多,最好一棵草只用一个quad来表示
  • 从不同的角度观察,草都必须显得密集
  • 草的排布不能过于规则,否则会不自然

综上,渲染草体时的经典结构——星形就出现了

unity-shader-草grass实现

星型结构可以减小从不同角度看到面片, 防止看到的知识面片的侧面 (观察方向与 面片平行, 也就啥都看不到)

顶点动画

在加上顶点动画, 让看起来有风吹的效果

if (o.uv.y > 0.5) {
    float4 translationPos =
        float4(sin(_Time.x * _TimeFactor * Pi ), 0, sin(_Time.y * _TimeFactor * Pi ), 0);
    v.vertex += translationPos * _StrengthFactor;
}

判断草面片的哪些顶底需要做动画, 用的是uv中的 v 值 > 0.5 (opengl, dx是反过来的) , 所以面片顶部顶点的v值要大于0.5

unity-shader-草grass实现