自带地形的grass"/>
模拟unity自带地形的grass
有一个项目地形是整个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 OffBlend SrcAlpha OneMinusSrcAlphaCull OffCGPROGRAM#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放上,就有朝向效果。 更多推荐
模拟unity自带地形的grass
发布评论