码上效果图:
官方教程链接:https://roystan.net/articles/grass-shader.html
个人能力有限,就不再班门弄斧了,下面简单介绍一下基本思路与个人经验总结,仅供学习参考_(:з」∠)_
1、基本思路
- 通过地面网格顶点生成三角形
- 调整三角形的方向随机
- 细分网格,调整草地疏密
- 利用流向图(Flow Map)来添加风
- 对生成的三角形进行细分,使其能够弯曲成草的样子
- 添加阴影接收与阴影投射
- 加入光照
——————完成
2、代码展示
MyGrass.shader
Shader "MayoHa/MyGrass"
{
Properties
{
_BottomColor("Bottom Color",Color) = (1,1,1,1)
_TopColor("Top Color",Color) = (1,1,1,1)
_BendRotationRandom("Bend Rotation Random",Range(0,1)) = 0.2
_BladeWidth("Blade Width", Float) = 0.05
_BladeWidthRandom("Blade Width Random", Float) = 0.02
_BladeHeight("Blade Height", Float) = 0.5
_BladeHeightRandom("Blade Height Random", Float) = 0.3
_TessellationUniform("Tessellation Uniform",Range(1,64)) = 1
_WindDistortionMap("Wind Distortion Map", 2D) = "white" {}
_WindFrequency("Wind Frequency", Vector) = (0.05, 0.05, 0, 0)
_WindStrength("Wind Strength", Float) = 1
_BladeForward("Blade Forward Amount", Float) = 0.38
_BladeCurve("Blade Curvature Amount", Range(1, 4)) = 2
_TranslucentGain("Translucent Gain", Range(0,1)) = 0.5
}
CGINCLUDE
#include "UnityCG.cginc"
#include "Autolight.cginc"
#include "CustomTessellation.cginc"
#define BLADE_SEGMENTS 3
fixed4 _BottomColor,_TopColor;
half _BendRotationRandom;
float _BladeHeight;
float _BladeHeightRandom;
float _BladeWidth;
float _BladeWidthRandom;
sampler2D _WindDistortionMap;
float4 _WindDistortionMap_ST;
float2 _WindFrequency;
float _WindStrength;
float _BladeForward;
float _BladeCurve;
float _TranslucentGain;
//to frag Shader
struct geometryOutput{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
unityShadowCoord4 _ShadowCoord : TEXCOORD1;
};
//DRY
geometryOutput DRY(float3 pos,float2 uv,float3 localNormal){
geometryOutput o;
o.pos = UnityObjectTo