榨干GPU 使用顶点颜色信息来创建千千万的高性能植被

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注