gdc vertex color

之前做Terrain Brush Grass 的时候一直被它的性能折磨,稍微密集一些的植被,帧数直接变为个位数。 而GDC上使用顶点动画的想法瞬间给了我许多启发。

说干,就干。
在 Unity 中拖出一个 Cube 拉伸出 草的模样,然后给顶点上色。 像这样
红色表示可以被晃动的顶点
绿色表示晃动的幅度

两个颜色叠加在一起的时候,就变成屎黄了。。。
不过根部没有颜色呈现黑色可以看出过度

vertex color1

最后在Shader如下

v2f vert (appdata v)
{
v2f o;
float scale = cos(_Time.y * _Speed) * v.color.r * (v.color.g);float szControl = randValue > 0.5;
v.vertex.z += scale * szControl;
v.vertex.x += scale * (1.0 – szControl);

float4 worldPos = mul(_Object2World, v.vertex);

o.normal = normalize(mul(_Object2World, v.normal));
o.worldPos = worldPos;
o.pos = mul(UNITY_MATRIX_VP, worldPos);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

return o;
}

fixed4 frag (v2f i) : SV_Target
{
float3 lightDir = normalize(WorldSpaceLightDir(i.worldPos));
float3 viewDir = normalize(_WorldSpaceCameraPos – i.worldPos);
float3 halfDir = normalize(lightDir + viewDir);
float3 diffuse = tex2D(_MainTex, i.uv) * max(0, dot(i.normal, lightDir));
float3 specular = _LightColor0.rgb * pow(max(0, dot(i.normal, halfDir)), _Shiness);
float4 finalCol = float4(diffuse + specular + UNITY_LIGHTMODEL_AMBIENT, 1.0);

return finalCol;
}

最后我在场景中放了 2.0w 根草, 随机摆动 draw call 1, 25帧
使用Terrain 的 Grass Brush 2000个草,就已经在 2.5帧了
grass