前言
借由 Unity Shader 实战学习 Shader !
带完整注释,一起学习 💪
效果
从圆心慢慢荡漾开的水波,有高低起伏感
👉展示备份(国内节点)
👇效果展示 (科学上网)
代码
1 2 3 4
   | 附件: 1. 高面数平面
  链接:https://pan.baidu.com/s/1EObyLpQZDsQUXAxXS_QVtg 提取码:ij83 
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
   | Shader "Unlit/AloeaShader04" {     Properties     {         _WaveAmp ("Wave Amplitude", Range(0, 0.1)) = 0.05     }     SubShader     {         Tags { "RenderType"="Opaque" }         LOD 100
          Pass         {             CGPROGRAM             #pragma vertex vert             #pragma fragment frag                #include "UnityCG.cginc"                float _WaveAmp;                struct appdata             {                 float4 vertex : POSITION;                 float2 uv : TEXCOORD0;             };
              struct v2f             {                 float2 uv : TEXCOORD0;                 float4 vertex : SV_POSITION;             };
                           float getWave ( float2 uv ) {                 float2 uvsCenter = uv * 2 - 1;                  float distance = length( uvsCenter );                                   float wave = cos((distance - _Time.y * 0.1 ) * 30);                                                   wave *= 1 - distance;                  return wave;             }
              v2f vert (appdata v)             {                 v2f o;
                  v.vertex.y = getWave(v.uv) * _WaveAmp; 
                  o.vertex = UnityObjectToClipPos(v.vertex);                 o.uv = v.uv;                 return o;             }
              fixed4 frag (v2f i) : SV_Target             {                 return getWave(i.uv);             }             ENDCG         }     } }
   | 
 
细节
效果调试过程
步骤一:找圆心点
1 2 3 4 5 6
   | fixed4 frag (v2f i) : SV_Target { 	 	 	return float4(i.uv * 2 - 1, 0, 0);  }
   | 
 
步骤二:绘制波动的圆心环
1 2 3 4 5 6
   | fixed4 frag (v2f i) : SV_Target { 	float2 uvsCenter = i.uv * 2 - 1;  	float distance = length( uvsCenter );  	float wave = cos((distance - _Time.y * 0.1 ) * 30) * 0.5 + 0.5;  	return wave;
   | 
 
步骤三:顶点坐标位移赋予一样的波动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   |  float getWave ( float2 uv ) { 	float2 uvsCenter = uv * 2 - 1;  	float distance = length( uvsCenter );  	float wave = cos((distance - _Time.y * 0.1 ) * 30) * 0.5 + 0.5;  	return wave; }
 
  v2f vert (appdata v) { 	v2f o; 	v.vertex.y = getWave(v.uv) * 0.1;  
  	o.vertex = UnityObjectToClipPos(v.vertex); 	o.uv = v.uv; 	return o; }
 
 
  | 
 
步骤三:效果参数调优
1 2 3 4 5 6 7 8 9
   | float getWave ( float2 uv ) { 	float2 uvsCenter = uv * 2 - 1; 	float distance = length( uvsCenter ); 	 	float wave = cos((distance - _Time.y * 0.1 ) * 30);  	wave *= 1 - distance;  	return wave;
  }
  | 
 
模型顶点数
在今天这个练习中,波动是在顶点上进行的,那么平面的顶点数越多,整个波动就越丝滑,顶点数越少,效果就很硬朗。
函数 length
length:相当于求向量 v 的长度。
二维向量
三维向量
文档:https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Length-Node.html
总结
- 关注变量的维度,比如 uv 是二维的(xy),color 是四维的( rgba )。
 
- 在这个案例中很直观地理解顶点着色器和片段着色器,一个用于处理顶点信息,也就是「形」,另一个用于处理表现信息,也就是「色」。
 
- 提取可复用的方法来增强代码的可维护性。
 
- 构建效果的过程就是关注数值变化的过程。