模拟unity自带地形的grass

来源:互联网 发布:c 怎么获取数组长度 编辑:程序博客网 时间:2024/05/16 17:37

 有一个项目地形是整个Mesh,项目想加入模拟Terrain中飘动草的效果。研究了一下grass,第一:那些grass有飘动的效果,应该是在一个面上作了个位点偏移shade;第二:grass一直保持朝向摄像机。  后来上网总结了一下,下面是一些代码。

关于小草有飘动的效果:加入如下shade的材质,放在Quad上:

Shader "Custom/Grass" {    Properties {        _MainTex ("Grass Texture", 2D) = "white" {}        _TimeScale ("Time Scale", float) = 1    }     SubShader{        Tags{"Queue"="Transparent" "RenderType"="Opaque" "IgnoreProject"="True"}        Pass{            Tags{"LightMode"="ForwardBase"}             ZWrite Off            Blend SrcAlpha OneMinusSrcAlpha            Cull Off             CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"             sampler2D _MainTex;            half _TimeScale;             struct a2v {                float4 vertex : POSITION;                float4 texcoord : TEXCOORD0;            };                         struct v2f {                float4 pos : SV_POSITION;                float2 uv : TEXCOORD0;            };              v2f vert(a2v v){                v2f o;                float4 offset = float4(0,0,0,0);                offset.x = sin(3.1416 * _Time.y * clamp(v.texcoord.y-0.5, 0, 1))  * _TimeScale;                o.pos = UnityObjectToClipPos(v.vertex + offset);                o.uv = v.texcoord.xy;                return o;            }             fixed4 frag(v2f i) : SV_Target{                return tex2D(_MainTex, i.uv);            }             ENDCG        }    }    FallBack Off}
第二:使小草正面朝向摄像机:代码如下
using System.Collections;using System.Collections.Generic;using UnityEngine;public class GrassFollow : MonoBehaviour {        public Camera m_Camera;    public Transform [] m_GrassObjs;//剩下的grass,跟着做同样动作    public Vector3 Normal;//面法线      Quaternion direction;    Vector3 m_qua;    public Vector3 Qua    {        get        {                       return m_qua;        }        set        {            m_qua.y  = value.y ;            m_qua.x = value.x;        }    }    void Start()    {        direction = Quaternion.FromToRotation(new Vector3(0, 0, 1), Normal);            }        void Update()    {        if(m_Camera==null)        {            return;        }                Qua = (m_Camera.transform.rotation * direction).eulerAngles;        transform.eulerAngles = Qua;                     foreach (Transform child in m_GrassObjs )        {                        child.rotation = transform.rotation;        }                    }}
上面代码把camera放上,就有朝向效果。


原创粉丝点击