目录

Shader案例

Shader案例

角色展示

../../imgs/2021-12-21-20-18-01.png

需要的贴图:
漫反射贴图;法线贴图;Metal,Roughness,SkinArea通道贴图CompMask(M,R,S);次表面散射LUT查找图;IBL Specular CubeMap环境图;IBL Diffuse 球谐数据(提前读取IBL Diffuse CubeMap数据);头发Aniso各向异性Noise贴图

../../imgs/avatorshow.gif
漫反射,镜面反射,环境反射,环境高光

身体部分

组成:

  • 直接光漫反射 Lambert
  • 直接光的镜面反射 Blinn-Phong 皮肤区域给一个很弱的高光(油光)
  • 间接光的漫反射 SH(球谐)
  • 间接光的镜面反射 CubeMap (Specular)
  • LUT SSS次表面散射(皮肤处理) LUT实现
  • 色彩矫正 ToneMaping ACES
  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
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
Shader "Custom/Role_Standard"
{
    Properties
    {
		_MainTex ("Texture", 2D) = "white" {}
		_CompMask("CompMask(R M)",2D) = "white"{}
		_NormalMap("NormalMap",2D) = "bump"{}
		_SpecShininess("Spec Shininess",Float)=10
        _RoughnessAdjust("Roughness Adjust",Range(-1,1))=0
        _MetalAdjust("Metal Adjust",Range(-1,1))=0
        _SkinLUT("Skin LUT",2D)="white"{}
        _CurveOffset("Curve Offset",Range(0,1))=1
        _LutOffset("LutOffset",Range(0,1))=0
		[Header(IBL Specular)]
		_Tint("Tint",Color)=(1,1,1,1)
		_Expose("Expose",Float)=1.0		
		_EnvMap("Env Cube",Cube)="white"{}
		_Rotate("Rotate",Range(0,360))=0
		
		[Toggle(_DIFFUSE_ON)]_DiffuseCheck("Diffuse Check",Float)=0
		[Toggle(_SPECULAR_ON)]_Specular_Check("Specular Check",Float)=0
		[Toggle(_SH_ON)]_SHCheck("SH Check",Float)=0
		[Toggle(_IBL_ON)]_IBLCheck("IBL Check",Float)=0
		[Toggle(_OILSKIN_ON)]_OilSkinCheck("Oil Skin Check",Float)=0
		
		[Space(20)]
		[Header(SH)]
		[HideInInspector]custom_SHAr("Custom SHAr", Vector) = (0, 0, 0, 0)
		[HideInInspector]custom_SHAg("Custom SHAg", Vector) = (0, 0, 0, 0)
		[HideInInspector]custom_SHAb("Custom SHAb", Vector) = (0, 0, 0, 0)
		[HideInInspector]custom_SHBr("Custom SHBr", Vector) = (0, 0, 0, 0)
		[HideInInspector]custom_SHBg("Custom SHBg", Vector) = (0, 0, 0, 0)
		[HideInInspector]custom_SHBb("Custom SHBb", Vector) = (0, 0, 0, 0)
		[HideInInspector]custom_SHC("Custom SHC", Vector) = (0, 0, 0, 1)			
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #pragma shader_feature _DIFFUSE_ON
            #pragma shader_feature _SPECULAR_ON
            #pragma shader_feature _SH_ON
            #pragma shader_feature _IBL_ON
            #pragma shader_feature _OILSKIN_ON
            
            #include "UnityCG.cginc"
            #include"AutoLight.cginc"

            struct appdata  // appdata_full
            {
                float4 vertex : POSITION; //模型空间顶点坐标
                half2 texcoord : TEXCOORD0; //第一套UV(模型最多只能有4套UV)
				half3 normal : NORMAL; //顶点法线
				half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
            };

            struct v2f
            {
                float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
                float2 uv : TEXCOORD0; //自定义数据体
                half3 normal_dir : TEXCOORD1;
                half3 tangent_dir : TEXCOORD2;
                half3 binormal_dir : TEXCOORD3;
                half3 pos_world : TEXCOORD4;
                //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
                LIGHTING_COORDS(5,6)   ///SHADOW 第一步
            };

			sampler2D _MainTex;
			sampler2D _CompMask;
			float4 _MainTex_ST;
			float4 _LightColor0;
			float _Shininess;
			float4 _AmbientColor;
			float _SpecIntensity;
			sampler2D _AOMap;
			sampler2D _SpecMask;
			sampler2D _NormalMap;
			float _NormalIntensity;
			sampler2D _ParallaxMap;
			float _Parallax;
            float _SpecShininess;
            float _RoughnessAdjust;
            float _MetalAdjust;
			float4 _Tint;
			float _Expose;            
            float _Rotate;
            samplerCUBE _EnvMap;
            float4 _EnvMap_HDR;
            sampler2D _SkinLUT;
            float _CurveOffset;
            float _LutOffset;
			half4 custom_SHAr;
			half4 custom_SHAg;
			half4 custom_SHAb;
			half4 custom_SHBr;
			half4 custom_SHBg;
			half4 custom_SHBb;
			half4 custom_SHC;	
			
            
            float3 ShadeSH(float3 normal_dir)
            {
				float4 normalForSH = float4(normal_dir, 1.0);
				//SHEvalLinearL0L1
				half3 x;
				x.r = dot(custom_SHAr, normalForSH);
				x.g = dot(custom_SHAg, normalForSH);
				x.b = dot(custom_SHAb, normalForSH);

				//SHEvalLinearL2
				half3 x1, x2;
				// 4 of the quadratic (L2) polynomials
				half4 vB = normalForSH.xyzz * normalForSH.yzzx;
				x1.r = dot(custom_SHBr, vB);
				x1.g = dot(custom_SHBg, vB);
				x1.b = dot(custom_SHBb, vB);

				// Final (5th) quadratic (L2) polynomial
				half vC = normalForSH.x*normalForSH.x - normalForSH.y*normalForSH.y;
				x2 = custom_SHC.rgb * vC;

				float3 sh = max(float3(0.0, 0.0, 0.0), (x + x1 + x2));
				sh = pow(sh, 1.0 / 2.2);  
				return sh;
            }
            
			float3 ACESFilm(float3 x)
			{
				float a = 2.51f;
				float b = 0.03f;
				float c = 2.43f;
				float d = 0.59f;
				float e = 0.14f;
				return saturate((x*(a*x + b)) / (x*(c*x + d) + e));
			};
			
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.pos_world=mul(unity_ObjectToWorld,v.vertex).xyz;
                o.normal_dir=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                o.tangent_dir=normalize(mul((float3x3)unity_ObjectToWorld,v.tangent.xyz));
                o.binormal_dir=normalize(cross(o.normal_dir, o.tangent_dir))*v.tangent.w;
                TRANSFER_VERTEX_TO_FRAGMENT(o); ///SHADOW 第二步
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                // Base Color
                half4 base_color=tex2D(_MainTex,i.uv);
                base_color=pow(base_color,2.2);// gamma转Liner空间
                half3 comp_mask=tex2D(_CompMask,i.uv);         
                half skin_area=1.0-comp_mask.b;
                half roughness=saturate(comp_mask.r+_RoughnessAdjust);
                half metal=saturate(comp_mask.g+ _MetalAdjust);
                half3 spec_color=lerp(0.04,base_color.rgb,metal);
                base_color=base_color*(1-metal);
                
                half3 pos_world=i.pos_world;
                half3 normal_dir=normalize(i.normal_dir);
                half3 tangent_dir=normalize(i.tangent_dir);
                half3 binormal_dir=normalize(i.binormal_dir);
                half3 view_dir=normalize(_WorldSpaceCameraPos.xyz-pos_world);
                float3x3 TBN=float3x3(tangent_dir,binormal_dir,normal_dir);
        
                
                // Noraml 法线
                half4 normalmap=tex2D(_NormalMap,i.uv);
                half3 normal_data=UnpackNormal(normalmap);
                // normal_data.xy = normal_data.xy * _NormalIntensity;
                normal_dir=normalize(mul(normal_data,TBN));
                //normal_dir = normalize(tangent_dir * normal_data.x * _NormalIntensity + binormal_dir * normal_data.y * _NormalIntensity + normal_dir * normal_data.z);

                // Light Info
                half3 light_dir=normalize(_WorldSpaceLightPos0.xyz);
                half4 light_color=_LightColor0.rgba;
                half atten=LIGHT_ATTENUATION(i);
                

                
                
                
                // Direct Diffuse 漫反射,Lambert
                half NdotL=max(0.0,dot(normal_dir,light_dir));
                half3 diffuse= base_color.rgb*NdotL*light_color.rgb*atten;
                half2 uv_lut=half2(NdotL*atten+_LutOffset,_CurveOffset);
                half3 lut_color_gamma=tex2D(_SkinLUT,uv_lut);
                half3 lut_color=pow(lut_color_gamma,2.2);
                half3 sss_diffuse=lut_color*base_color*_LightColor0.rgb;
                #ifdef _DIFFUSE_ON
                half3 direct_diffuse=lerp(diffuse,sss_diffuse,skin_area);
                #else
                half3 direct_diffuse=half3(0,0,0);
                #endif
                
                // Direct Specular 镜面反射(高光) Blinn-Phong
                half smoothness=1.0-roughness;
                half3 half_dir=normalize(view_dir+light_dir);
                half NdotH=max(0.0,dot(normal_dir,half_dir));
                half shininess=lerp(1,_SpecShininess,smoothness);
                half spec=pow(NdotH,shininess);
                #ifdef _OILSKIN_ON
                half3 spec_skin_color=lerp(spec_color,0.1,skin_area); //皮肤油光
                #else
                half3 spec_skin_color=spec_color;
                #endif
                
                #ifdef _SPECULAR_ON
                half3 direct_specular=spec*spec_skin_color*light_color.rgb*atten;
                #else
                half3 direct_specular=half3(0,0,0);
                #endif
                
                //Indirect Diffuse 间接光的漫反射
                float half_lambert=dot(normal_dir,light_dir)*0.5+0.5;
                #ifdef _SH_ON
                half3 env_diffuse= ShadeSH(normal_dir)*base_color*half_lambert;
                #else
                half3 env_diffuse=half3(0,0,0);
                #endif                
                
                // Indirect Specular 间接光的镜面反射
				half3 rViewDir=reflect(-view_dir,normal_dir);
				float rad=_Rotate*UNITY_PI/180;
				float2x2 Rotation=float2x2(cos(rad),sin(rad),-sin(rad),cos(rad));
				rViewDir.xz=mul(Rotation,rViewDir.xz);
				
			    roughness=roughness*(1.7-0.7*roughness);
				float mip_level=(roughness)*6.0;
				half4 color_cube=texCUBElod(_EnvMap,float4(rViewDir,mip_level));
				half3 env_specular=DecodeHDR(color_cube,_EnvMap_HDR)*_Expose*spec_color*half_lambert*(1-skin_area);
                #ifdef _IBL_ON
                #else
                env_specular=half3(0,0,0);
                #endif                
                
                
				half3 final_color = (direct_diffuse + direct_specular + env_diffuse+env_specular);
				half3 tone_color = ACESFilm(final_color);
				tone_color = pow(tone_color, 1.0 / 2.2);                
                return half4(tone_color,1.0);
                // return half4(final_color,1.0);
            }
            ENDCG
        }
        
    }
    Fallback "Diffuse" ///SHADOW 第四步
}

头发部分

头发处理:Kajiya-Kay各向异性头发(Kajiya-Kay头发

组成:

  • 直接光的漫反射 Lambert
  • 直接光的镜面反射,双层高光 Kajiya-Kay各向异性头发(Kajiya-Kay头发
  • 间接光的镜面反射 CubeMap (Specular)
  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
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
Shader "Custom/Role_Hair"
{
    Properties
    {
		_MainTex ("Texture", 2D) = "white" {}
		_BaseColor("Base Color",Color)=(1,1,1,1)
		_NormalMap("NormalMap",2D) = "bump"{}
		_RoughnessAdjust("Roughness Adjust",Range(0,1))=0
		
		[Header(Specular)]
		_AnisoMap("Aniso Map",2D)="gray"{}
		_SpecColor1("Spec Color 1",Color)=(1,1,1,1)
		_SpecShininess1("Spec Shininess 1",Range(0,1))=0.1
		_SpecNoise1("Spec Noise 1",float)=1
		_SpecOffset1("Spec Offset 1",float)=0
		_SpecColor2("Spec Color 2",Color)=(1,1,1,1)
		_SpecShininess2("Spec Shininess 2",Range(0,1))=0.1
		_SpecNoise2("Spec Noise 2",float)=1
		_SpecOffset2("Spec Offset 2",float)=0		
		
		[Header(IBL Specular)]
		_Tint("Tint",Color)=(1,1,1,1)
		_Expose("Expose",Float)=1.0		
		_EnvMap("Env Cube",Cube)="white"{}
		_Rotate("Rotate",Range(0,360))=0
		
		[Toggle(_DIFFUSE_ON)]_DiffuseCheck("Diffuse Check",Float)=0
		[Toggle(_SPECULAR_ON)]_Specular_Check("Specular Check",Float)=0
		// [Toggle(_SH_ON)]_SHCheck("SH Check",Float)=0
		[Toggle(_IBL_ON)]_IBLCheck("IBL Check",Float)=0		
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #pragma shader_feature _DIFFUSE_ON
            #pragma shader_feature _SPECULAR_ON
            #pragma shader_feature _SH_ON
            #pragma shader_feature _IBL_ON
            #pragma shader_feature _OILSKIN_ON
            
            #include "UnityCG.cginc"
            #include"AutoLight.cginc"

            struct appdata  // appdata_full
            {
                float4 vertex : POSITION; //模型空间顶点坐标
                half2 texcoord : TEXCOORD0; //第一套UV(模型最多只能有4套UV)
				half3 normal : NORMAL; //顶点法线
				half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
            };

            struct v2f
            {
                float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
                float2 uv : TEXCOORD0; //自定义数据体
                half3 normal_dir : TEXCOORD1;
                half3 tangent_dir : TEXCOORD2;
                half3 binormal_dir : TEXCOORD3;
                half3 pos_world : TEXCOORD4;
                //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
                LIGHTING_COORDS(5,6)   ///SHADOW 第一步
            };

			sampler2D _MainTex;
			sampler2D _CompMask;
			float4 _MainTex_ST;
			float4 _LightColor0;
			float _Shininess;
			float4 _AmbientColor;
			float _SpecIntensity;
			sampler2D _AOMap;
			sampler2D _SpecMask;
			sampler2D _NormalMap;
			float _NormalIntensity;
			sampler2D _ParallaxMap;
			float _Parallax;
            float _SpecShininess;
            float _RoughnessAdjust;
            float _MetalAdjust;
			float4 _Tint;
			float _Expose;            
            float _Rotate;
            samplerCUBE _EnvMap;
            float4 _EnvMap_HDR;
            sampler2D _SkinLUT;
            float _CurveOffset;
            float _LutOffset;
			half4 custom_SHAr;
			half4 custom_SHAg;
			half4 custom_SHAb;
			half4 custom_SHBr;
			half4 custom_SHBg;
			half4 custom_SHBb;
			half4 custom_SHC;	
			float _BaseColor;
			sampler2D _AnisoMap;
			float4 _AnisoMap_ST;
			
			
		float4 _SpecColor1;
		float _SpecShininess1;
		float _SpecNoise1;
		float _SpecOffset1;
		float4 _SpecColor2;
		float _SpecShininess2;
		float _SpecNoise2;
		float _SpecOffset2;
            
			float3 ACESFilm(float3 x)
			{
				float a = 2.51f;
				float b = 0.03f;
				float c = 2.43f;
				float d = 0.59f;
				float e = 0.14f;
				return saturate((x*(a*x + b)) / (x*(c*x + d) + e));
			};
			
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.pos_world=mul(unity_ObjectToWorld,v.vertex).xyz;
                o.normal_dir=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                o.tangent_dir=normalize(mul((float3x3)unity_ObjectToWorld,v.tangent.xyz));
                o.binormal_dir=normalize(cross(o.normal_dir, o.tangent_dir))*v.tangent.w;
                TRANSFER_VERTEX_TO_FRAGMENT(o); ///SHADOW 第二步
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                // Base Color
                half4 base_color=tex2D(_MainTex,i.uv);
                base_color=pow(base_color,2.2);// gamma转Liner空间
                half4 spec_color=base_color;
                
                half roughness=saturate(_RoughnessAdjust);
                
                half3 pos_world=i.pos_world;
                half3 normal_dir=normalize(i.normal_dir);
                half3 tangent_dir=normalize(i.tangent_dir);
                half3 binormal_dir=normalize(i.binormal_dir);
                half3 view_dir=normalize(_WorldSpaceCameraPos.xyz-pos_world);
                float3x3 TBN=float3x3(tangent_dir,binormal_dir,normal_dir);
        
                
                // Noraml 法线
                half4 normalmap=tex2D(_NormalMap,i.uv);
                half3 normal_data=UnpackNormal(normalmap);
                // normal_data.xy = normal_data.xy * _NormalIntensity;
                normal_dir=normalize(mul(normal_data,TBN));
                //normal_dir = normalize(tangent_dir * normal_data.x * _NormalIntensity + binormal_dir * normal_data.y * _NormalIntensity + normal_dir * normal_data.z);

                // Light Info
                half3 light_dir=normalize(_WorldSpaceLightPos0.xyz);
                half4 light_color=_LightColor0.rgba;
                half atten=LIGHT_ATTENUATION(i);
                

                
                
                
                // Direct Diffuse 漫反射,Lambert
                
                half NdotL=max(0.0,dot(normal_dir,light_dir));
                half half_lambert=NdotL*0.5+0.5;
                half3 direct_diffuse=base_color;
                
                // Direct Specular 镜面反射(高光) Blinn-Phong
                float aniso_noise=tex2D(_AnisoMap,i.uv*_AnisoMap_ST.xy+_AnisoMap_ST.zw).r-0.5;
                
                half3 half_dir=normalize(view_dir+light_dir);
                half NdotH=dot(normal_dir,half_dir);
                half TdotH=dot(tangent_dir,half_dir);
                
                half NdotV=max(0.0,dot(normal_dir,view_dir));
                float aniso_atten=saturate(sqrt(max(0.0,half_lambert/NdotV)))*atten;
                
                // spec1
                float3 spec_color1=_SpecColor1.rgb+base_color;
                half3 b_offset1=normal_dir*(_SpecOffset1+_SpecNoise1*aniso_noise);
                half3 binormal_dir1=normalize(binormal_dir+b_offset1);
                half BdotH1=dot(binormal_dir1,half_dir)/_SpecShininess1;
                float3 spec_term1=exp(-(TdotH*TdotH+BdotH1*BdotH1)/(1.0+NdotH));
                float3 final_spec1=spec_term1*aniso_atten*spec_color1*light_color.rgb;
                
                //spec2 
                float3 spec_color2=_SpecColor2.rgb+base_color;
                half3 b_offset2=normal_dir*(_SpecOffset2+_SpecNoise2*aniso_noise);
                half3 binormal_dir2=normalize(binormal_dir+b_offset2);
                half BdotH2=dot(binormal_dir2,half_dir)/_SpecShininess2;
                float3 spec_term2=exp(-(TdotH*TdotH+BdotH2*BdotH2)/(1.0+NdotH));
                float3 final_spec2=spec_term2*aniso_atten*spec_color2*light_color.rgb;                

                // Indirect Specular 间接光的镜面反射
				half3 rViewDir=reflect(-view_dir,normal_dir);
				float rad=_Rotate*UNITY_PI/180;
				float2x2 Rotation=float2x2(cos(rad),sin(rad),-sin(rad),cos(rad));
				rViewDir.xz=mul(Rotation,rViewDir.xz);
				
			    roughness=roughness*(1.7-0.7*roughness);
				float mip_level=(roughness)*6.0;
				half4 color_cube=texCUBElod(_EnvMap,float4(rViewDir,mip_level));
				float3 color_ibl=DecodeHDR(color_cube,_EnvMap_HDR);
				half3 env_specular=color_ibl*_Expose*half_lambert*aniso_noise;
                #ifdef _IBL_ON
                #else
                env_specular=half3(0,0,0);
                #endif                
                #ifdef _DIFFUSE_ON
                #else
                direct_diffuse=half3(0,0,0);
                #endif   
                #ifdef _SPECULAR_ON
                #else
                final_spec1=half3(0,0,0);
                final_spec2=half3(0,0,0);
                #endif                                   
                
				half3 final_color = (final_spec1 + final_spec2+direct_diffuse+env_specular);
				// half3 final_color = (direct_diffuse + direct_specular+env_specular);
				half3 tone_color = ACESFilm(final_color);
				tone_color = pow(tone_color, 1.0 / 2.2);                
                return half4(tone_color,1.0);
                // return half4(final_color,1.0);
            }
            ENDCG
        }
        
    }
    Fallback "Diffuse" ///SHADOW 第四步
}

玉龙

../../imgs/CleanShot2022-03-17.gif 漫反射,透射光(高光),环境光

透射光实现:根据光反方向(增加法线的扭曲,表示玉龙表面的粗糙情况影响光线的方向)和视线方向夹角来判定透射光的强度(假设从玉龙后面有个手电筒和人眼的夹角,越小表示人眼看到的光线越多,光越强),然后通过厚度图来模拟玉龙的通透性

  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
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
Shader "CS03/Dragon"
{
    Properties
    {
		_DiffuseColor ("Diffuse Color", Color) = (1,1,1,1)
		_Opacity("Opacity",Float)=1
		_AddColor ("Add Color", Color) = (1,1,1,1)
		_Distort("Distort",Range(0,1))=0
		_Power("Power",Float)=2
		_Scale("Scale",Float)=1
		_ThicknessMap ("Thickness Map", 2D) = "black" {}
		_CubeMap ("Cube Map", CUBE) = "white" {}
		_EnvRotate("Env Rotate",Range(0,360))=0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags{"LightMode" = "ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            #include"AutoLight.cginc"

            struct appdata  // appdata_full
            {
                float4 vertex : POSITION; //模型空间顶点坐标
                half2 texcoord : TEXCOORD0; //第一套UV(模型最多只能有4套UV)
				half2 texcoord1 : TEXCOORD1; //第二套UV
				half2 texcoord2 : TEXCOORD2; //第三套UV
				half2 texcoord3 : TEXCOORD3;  //第四套UV,模型最多只能有4套UV
				half4 color : COLOR; //顶点颜色
				half3 normal : NORMAL; //顶点法线
				half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
            };

            struct v2f
            {
                float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
                float2 uv : TEXCOORD0; //自定义数据体
                half3 normal_dir : TEXCOORD1;
                half3 tangent_dir : TEXCOORD2;
                half3 binormal_dir : TEXCOORD3;
                half3 pos_world : TEXCOORD4;
                //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
            };

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float4 _LightColor0;
			sampler2D _NormalMap;
			float _Distort;
			float _Power;
			float _Scale;
			sampler2D _ThicknessMap;
            samplerCUBE _CubeMap;
            float4 _CubeMap_HDR;
            float _EnvRotate;
            float4 _DiffuseColor;
            float4 _AddColor;
            float _Opacity;
			
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.pos_world=mul(unity_ObjectToWorld,v.vertex).xyz;
                o.normal_dir=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                o.tangent_dir=normalize(mul((float3x3)unity_ObjectToWorld,v.tangent.xyz));
                o.binormal_dir=normalize(cross(o.normal_dir, o.tangent_dir))*v.tangent.w;
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                half3 pos_world=i.pos_world;
                half3 normal_dir=normalize(i.normal_dir);
                half3 tangent_dir=normalize(i.tangent_dir);
                half3 binormal_dir=normalize(i.binormal_dir);
                half3 view_dir=normalize(_WorldSpaceCameraPos.xyz-pos_world);
                float3x3 TBN=float3x3(tangent_dir,binormal_dir,normal_dir);
                // Light
                half3 light_dir=normalize(_WorldSpaceLightPos0.xyz);
                half4 light_color=_LightColor0.rgba;
                half atten=1.0;
                
                //漫反射
                float NdotL=max(0.0,dot(normal_dir,light_dir));
                float3 color_diffuse=NdotL*_DiffuseColor.rgb*light_color.rgb;
                float sky_light=(dot(normal_dir,float3(0,1,0))+1.0)*0.5;
                float3 color_sky=sky_light*_DiffuseColor.rgb;
                float3 final_diffuse=color_diffuse+_AddColor.rgb+color_sky*_Opacity;
                
                // 透射光
                float3 back_dir=-normalize(light_dir+normal_dir*_Distort);
                float VdotB=max(0.0,dot(view_dir,back_dir));
                float backlight_term=max(0.0,pow(VdotB,_Power))*_Scale;
                float thickness=1.0-tex2D(_ThicknessMap,i.uv).r;
                half3 back_color=backlight_term*light_color*thickness;           

                // 光泽反射
                float3 rView_dir=reflect(-view_dir,normal_dir);
                float drag=_EnvRotate*UNITY_PI/180.0;
                float2x2 Roration=float2x2(cos(drag),sin(drag),-sin(drag),cos(drag));
                rView_dir.xz=mul(Roration,rView_dir.xz);
                half4 color_cube=texCUBE(_CubeMap,rView_dir);
                float3 color_env=DecodeHDR(color_cube,_CubeMap_HDR);
                half fresnel=1.0-max(0.0,dot(normal_dir,view_dir));
                float3 final_env=color_env*fresnel;
                
                float3 color_final=final_diffuse+final_env+ back_color;
                
                // return half4(thickness.xxx,1.0);
                return half4(color_final,1.0);
            }
            ENDCG
        }     
        Pass
        {
            Tags{"LightMode" = "ForwardAdd"}
            Blend One One
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdadd
            #include "UnityCG.cginc"
            #include"AutoLight.cginc"

            struct appdata  // appdata_full
            {
                float4 vertex : POSITION; //模型空间顶点坐标
                half2 texcoord : TEXCOORD0; //第一套UV(模型最多只能有4套UV)
				half2 texcoord1 : TEXCOORD1; //第二套UV
				half2 texcoord2 : TEXCOORD2; //第三套UV
				half2 texcoord3 : TEXCOORD3;  //第四套UV,模型最多只能有4套UV
				half4 color : COLOR; //顶点颜色
				half3 normal : NORMAL; //顶点法线
				half4 tangent : TANGENT; //顶点切线(模型导入Unity后自动计算得到)
            };

            struct v2f
            {
                float4 pos : SV_POSITION; //输出裁剪空间下的顶点坐标数据,给光栅化使用,必须要写的数据
                float2 uv : TEXCOORD0; //自定义数据体
                half3 normal_dir : TEXCOORD1;
                half3 tangent_dir : TEXCOORD2;
                half3 binormal_dir : TEXCOORD3;
                half3 pos_world : TEXCOORD4;
                //最多可以写16个:TEXCOORD0 ~ TEXCOORD15。
                LIGHTING_COORDS(5,6)
            };

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float4 _LightColor0;
			sampler2D _NormalMap;
			float _Distort;
			float _Power;
			float _Scale;
			sampler2D _ThicknessMap;
            samplerCUBE _CubeMap;
            float4 _CubeMap_HDR;
            float _EnvRotate;
            float4 _DiffuseColor;
            float4 _AddColor;
            float _Opacity;
			
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.pos_world=mul(unity_ObjectToWorld,v.vertex).xyz;
                o.normal_dir=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
                o.tangent_dir=normalize(mul((float3x3)unity_ObjectToWorld,v.tangent.xyz));
                o.binormal_dir=normalize(cross(o.normal_dir, o.tangent_dir))*v.tangent.w;
                TRANSFER_VERTEX_TO_FRAGMENT(o);
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                half shadow = SHADOW_ATTENUATION(i); ///SHADOW 第三步
            
                half3 pos_world=i.pos_world;
                half3 normal_dir=normalize(i.normal_dir);
                half3 tangent_dir=normalize(i.tangent_dir);
                half3 binormal_dir=normalize(i.binormal_dir);
                half3 view_dir=normalize(_WorldSpaceCameraPos.xyz-pos_world);
                float3x3 TBN=float3x3(tangent_dir,binormal_dir,normal_dir);
                // Light
                half3 light_dir=normalize(_WorldSpaceLightPos0.xyz);
                half4 light_color=_LightColor0.rgba;
                half atten=LIGHT_ATTENUATION(i);
                
                // 透射光
                float3 back_dir=-normalize(light_dir+normal_dir*_Distort);
                float VdotB=max(0.0,dot(view_dir,back_dir));
                float backlight_term=max(0.0,pow(VdotB,_Power))*_Scale;
                float thickness=1.0-tex2D(_ThicknessMap,i.uv).r;
                half3 back_color=backlight_term*light_color*thickness;           
                
                float3 color_final=back_color;
                return half4(color_final,1.0);
            }
            ENDCG
        }             
    }
    Fallback "Diffuse" ///SHADOW 第四步
}

钻石

../../imgs/CleanShot2022-03-17_12.27.gif

双Pass渲染,一个背面渲染(cubemap的反射和折射),一个前面渲染(折射和菲涅尔)

ASE

  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
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
// Made with Amplify Shader Editor
// Available at the Unity Asset Store - http://u3d.as/y3X 
Shader "CS07/Diamond"
{
	Properties
	{
		_ColorA("Color A", Color) = (0.02491992,0.09269338,0.754717,0)
		_RefractTex("RefractTex", CUBE) = "white" {}
		_ReflectTex("ReflectTex", CUBE) = "white" {}
		_ReflectIntensity("ReflectIntensity", Float) = 1
		_RefractIntensity("RefractIntensity", Float) = 1
		_RimPower("RimPower", Float) = 5
		_RimBias("RimBias", Float) = 0
		_RimScale("RimScale", Float) = 0
		_RimColor("RimColor", Color) = (0,0,0,0)

	}
	
	SubShader
	{
		
		
		Tags { "RenderType"="Opaque" "Queue"="Geometry" }
	LOD 100

		
		
		
		Pass
		{
			Name "Unlit"
			Tags { "LightMode"="ForwardBase" }

		CGINCLUDE
		#pragma target 3.0
		ENDCG
		Blend Off
		AlphaToMask Off
		Cull Front
		ColorMask RGBA
		ZWrite On
		ZTest LEqual
		Offset 0 , 0
		

			CGPROGRAM

			

			#ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
			//only defining to not throw compilation error over Unity 5.5
			#define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)
			#endif
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_instancing
			#include "UnityCG.cginc"
			#define ASE_NEEDS_FRAG_WORLD_POSITION


			struct appdata
			{
				float4 vertex : POSITION;
				float4 color : COLOR;
				float3 ase_normal : NORMAL;
				UNITY_VERTEX_INPUT_INSTANCE_ID
			};
			
			struct v2f
			{
				float4 vertex : SV_POSITION;
				#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
				float3 worldPos : TEXCOORD0;
				#endif
				float4 ase_texcoord1 : TEXCOORD1;
				UNITY_VERTEX_INPUT_INSTANCE_ID
				UNITY_VERTEX_OUTPUT_STEREO
			};

			uniform float4 _ColorA;
			uniform samplerCUBE _RefractTex;
			uniform samplerCUBE _ReflectTex;
			uniform float _RefractIntensity;

			
			v2f vert ( appdata v )
			{
				v2f o;
				UNITY_SETUP_INSTANCE_ID(v);
				UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
				UNITY_TRANSFER_INSTANCE_ID(v, o);

				float3 ase_worldNormal = UnityObjectToWorldNormal(v.ase_normal);
				o.ase_texcoord1.xyz = ase_worldNormal;
				
				
				//setting value to unused interpolator channels and avoid initialization warnings
				o.ase_texcoord1.w = 0;
				float3 vertexValue = float3(0, 0, 0);
				#if ASE_ABSOLUTE_VERTEX_POS
				vertexValue = v.vertex.xyz;
				#endif
				vertexValue = vertexValue;
				#if ASE_ABSOLUTE_VERTEX_POS
				v.vertex.xyz = vertexValue;
				#else
				v.vertex.xyz += vertexValue;
				#endif
				o.vertex = UnityObjectToClipPos(v.vertex);

				#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				#endif
				return o;
			}
			
			fixed4 frag (v2f i ) : SV_Target
			{
				UNITY_SETUP_INSTANCE_ID(i);
				UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
				fixed4 finalColor;
				#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
				float3 WorldPosition = i.worldPos;
				#endif
				float3 ase_worldNormal = i.ase_texcoord1.xyz;
				float3 ase_worldViewDir = UnityWorldSpaceViewDir(WorldPosition);
				ase_worldViewDir = normalize(ase_worldViewDir);
				float3 ase_worldReflection = reflect(-ase_worldViewDir, ase_worldNormal);
				float4 texCUBENode7 = texCUBE( _ReflectTex, ase_worldReflection );
				float4 temp_output_12_0 = ( _ColorA * texCUBE( _RefractTex, ase_worldReflection ) * texCUBENode7 * _RefractIntensity );
				
				
				finalColor = temp_output_12_0;
				return finalColor;
			}
			ENDCG
		}
		
		Pass
		{
			Name "Second"
			Tags { "LightMode"="ForwardBase" }

		CGINCLUDE
		#pragma target 3.0
		ENDCG
		Blend One One
		AlphaToMask Off
		Cull Back
		ColorMask RGBA
		ZWrite On
		ZTest LEqual
		Offset 0 , 0
		

			CGPROGRAM

			

			#ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
			//only defining to not throw compilation error over Unity 5.5
			#define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)
			#endif
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_instancing
			#include "UnityCG.cginc"
			#define ASE_NEEDS_FRAG_WORLD_POSITION


			struct appdata
			{
				float4 vertex : POSITION;
				float4 color : COLOR;
				float3 ase_normal : NORMAL;
				UNITY_VERTEX_INPUT_INSTANCE_ID
			};
			
			struct v2f
			{
				float4 vertex : SV_POSITION;
				#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
				float3 worldPos : TEXCOORD0;
				#endif
				float4 ase_texcoord1 : TEXCOORD1;
				UNITY_VERTEX_INPUT_INSTANCE_ID
				UNITY_VERTEX_OUTPUT_STEREO
			};

			uniform float4 _ColorA;
			uniform samplerCUBE _RefractTex;
			uniform samplerCUBE _ReflectTex;
			uniform float _RefractIntensity;
			uniform float _ReflectIntensity;
			uniform float _RimPower;
			uniform float _RimScale;
			uniform float _RimBias;
			uniform float4 _RimColor;

			
			v2f vert ( appdata v )
			{
				v2f o;
				UNITY_SETUP_INSTANCE_ID(v);
				UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
				UNITY_TRANSFER_INSTANCE_ID(v, o);

				float3 ase_worldNormal = UnityObjectToWorldNormal(v.ase_normal);
				o.ase_texcoord1.xyz = ase_worldNormal;
				
				
				//setting value to unused interpolator channels and avoid initialization warnings
				o.ase_texcoord1.w = 0;
				float3 vertexValue = float3(0, 0, 0);
				#if ASE_ABSOLUTE_VERTEX_POS
				vertexValue = v.vertex.xyz;
				#endif
				vertexValue = vertexValue;
				#if ASE_ABSOLUTE_VERTEX_POS
				v.vertex.xyz = vertexValue;
				#else
				v.vertex.xyz += vertexValue;
				#endif
				o.vertex = UnityObjectToClipPos(v.vertex);

				#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				#endif
				return o;
			}
			
			fixed4 frag (v2f i ) : SV_Target
			{
				UNITY_SETUP_INSTANCE_ID(i);
				UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
				fixed4 finalColor;
				#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
				float3 WorldPosition = i.worldPos;
				#endif
				float3 ase_worldNormal = i.ase_texcoord1.xyz;
				float3 ase_worldViewDir = UnityWorldSpaceViewDir(WorldPosition);
				ase_worldViewDir = normalize(ase_worldViewDir);
				float3 ase_worldReflection = reflect(-ase_worldViewDir, ase_worldNormal);
				float4 texCUBENode7 = texCUBE( _ReflectTex, ase_worldReflection );
				float4 temp_output_12_0 = ( _ColorA * texCUBE( _RefractTex, ase_worldReflection ) * texCUBENode7 * _RefractIntensity );
				float dotResult21 = dot( ase_worldNormal , ase_worldViewDir );
				float clampResult23 = clamp( dotResult21 , 0.0 , 1.0 );
				float temp_output_24_0 = ( 1.0 - clampResult23 );
				float4 temp_output_16_0 = ( temp_output_12_0 + ( texCUBENode7 * _ReflectIntensity * temp_output_24_0 ) );
				float saferPower25 = max( temp_output_24_0 , 0.0001 );
				float temp_output_30_0 = ( ( max( pow( saferPower25 , _RimPower ) , 0.0 ) * _RimScale ) + _RimBias );
				
				
				finalColor = ( temp_output_16_0 + ( temp_output_16_0 * temp_output_30_0 * ( temp_output_30_0 * _RimColor ) ) );
				return finalColor;
			}
			ENDCG
		}
		
	}
	CustomEditor "ASEMaterialInspector"
	
	
}
/*ASEBEGIN
Version=18500
2500;488;1639;969;571.4478;525.8101;1.694416;True;False
Node;AmplifyShaderEditor.CommentaryNode;40;-1788.975,781.5402;Inherit;False;2012.625;729.3613;Fresnel;13;22;19;21;23;26;24;25;27;29;28;31;30;32;;1,1,1,1;0;0
Node;AmplifyShaderEditor.WorldNormalVector;19;-1738.975,831.5402;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.ViewDirInputsCoordNode;22;-1716.198,1112.462;Inherit;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.DotProductOpNode;21;-1330.5,1006.167;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0
Node;AmplifyShaderEditor.ClampOpNode;23;-1181.688,992.5009;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.OneMinusNode;24;-1000.987,1000.093;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;26;-1107.281,1180.793;Inherit;False;Property;_RimPower;RimPower;5;0;Create;True;0;0;False;0;False;5;10;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.PowerNode;25;-809.6565,994.0192;Inherit;False;True;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0
Node;AmplifyShaderEditor.WorldReflectionVector;13;-1153.126,32.63672;Inherit;False;False;1;0;FLOAT3;0,0,0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3
Node;AmplifyShaderEditor.RangedFloatNode;29;-647.2493,1140.901;Inherit;False;Property;_RimScale;RimScale;7;0;Create;True;0;0;False;0;False;0;5;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleMaxOpNode;27;-617.2493,995.9019;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;7;-562.063,172.0891;Inherit;True;Property;_ReflectTex;ReflectTex;2;0;Create;True;0;0;False;0;False;-1;None;7ecb52b18a453124283cee921dc388cf;True;0;False;white;LockedToCube;False;Object;-1;Auto;Cube;8;0;SAMPLERCUBE;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.ColorNode;2;-506.5,-301.5;Inherit;False;Property;_ColorA;Color A;0;0;Create;True;0;0;False;0;False;0.02491992,0.09269338,0.754717,0;0.5754717,0.5754717,0.5754717,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.RangedFloatNode;17;-514.6671,98.24844;Inherit;False;Property;_RefractIntensity;RefractIntensity;4;0;Create;True;0;0;False;0;False;1;5;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SamplerNode;6;-570.063,-90.91089;Inherit;True;Property;_RefractTex;RefractTex;1;0;Create;True;0;0;False;0;False;-1;None;e9efb1d234a58c04cbb0a0c9eb87d214;True;0;False;white;LockedToCube;False;Object;-1;Auto;Cube;8;0;SAMPLERCUBE;;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;28;-399.2493,1052.902;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;31;-469.4467,1211.618;Inherit;False;Property;_RimBias;RimBias;6;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.RangedFloatNode;15;-466.0444,392.8555;Inherit;False;Property;_ReflectIntensity;ReflectIntensity;3;0;Create;True;0;0;False;0;False;1;1;0;0;0;1;FLOAT;0
Node;AmplifyShaderEditor.SimpleAddOpNode;30;-172.2493,1094.901;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0
Node;AmplifyShaderEditor.ColorNode;36;255.3527,989.3035;Inherit;False;Property;_RimColor;RimColor;8;0;Create;True;0;0;False;0;False;0,0,0,0;0.8970588,0.8623443,0.4551255,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;18;-131.6671,296.2484;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;12;-81.06299,-120.9109;Inherit;False;4;4;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;FLOAT;0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleAddOpNode;16;119.3329,185.2484;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;35;460.0375,793.4158;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleMultiplyOpNode;33;309.5573,294.3183;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;2;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.SimpleAddOpNode;34;540.5623,209.1047;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0
Node;AmplifyShaderEditor.FresnelNode;32;-708.2494,1308.901;Inherit;False;Standard;WorldNormal;ViewDir;False;False;5;0;FLOAT3;0,0,1;False;4;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;1;False;3;FLOAT;5;False;1;FLOAT;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;39;977.4616,398.2424;Float;False;False;-1;2;ASEMaterialInspector;100;9;New Amplify Shader;0a6bbb37052a2458b860677ab2960714;True;Second;0;1;Second;2;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;False;0;True;4;1;False;-1;1;False;-1;0;1;False;-1;0;False;-1;True;0;False;-1;0;False;-1;False;False;False;False;False;False;True;0;False;-1;True;0;False;-1;True;True;True;True;True;0;False;-1;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;0;False;-1;True;0;False;-1;True;True;0;False;-1;0;False;-1;True;1;LightMode=ForwardBase;True;2;0;;0;0;Standard;0;False;0
Node;AmplifyShaderEditor.TemplateMultiPassMasterNode;38;987.6282,-86.66805;Float;False;True;-1;2;ASEMaterialInspector;100;9;CS07/Diamond;0a6bbb37052a2458b860677ab2960714;True;Unlit;0;0;Unlit;2;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;True;2;RenderType=Opaque=RenderType;Queue=Geometry=Queue=0;False;0;True;0;1;False;-1;0;False;-1;0;1;False;-1;0;False;-1;True;0;False;-1;0;False;-1;False;False;False;False;False;False;True;0;False;-1;True;1;False;-1;True;True;True;True;True;0;False;-1;False;False;False;True;False;255;False;-1;255;False;-1;255;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;7;False;-1;1;False;-1;1;False;-1;1;False;-1;True;0;False;-1;True;0;False;-1;True;True;0;False;-1;0;False;-1;True;1;LightMode=ForwardBase;True;2;0;;0;0;Standard;1;Vertex Position,InvertActionOnDeselection;1;0;2;True;True;False;;False;0
WireConnection;21;0;19;0
WireConnection;21;1;22;0
WireConnection;23;0;21;0
WireConnection;24;0;23;0
WireConnection;25;0;24;0
WireConnection;25;1;26;0
WireConnection;27;0;25;0
WireConnection;7;1;13;0
WireConnection;6;1;13;0
WireConnection;28;0;27;0
WireConnection;28;1;29;0
WireConnection;30;0;28;0
WireConnection;30;1;31;0
WireConnection;18;0;7;0
WireConnection;18;1;15;0
WireConnection;18;2;24;0
WireConnection;12;0;2;0
WireConnection;12;1;6;0
WireConnection;12;2;7;0
WireConnection;12;3;17;0
WireConnection;16;0;12;0
WireConnection;16;1;18;0
WireConnection;35;0;30;0
WireConnection;35;1;36;0
WireConnection;33;0;16;0
WireConnection;33;1;30;0
WireConnection;33;2;35;0
WireConnection;34;0;16;0
WireConnection;34;1;33;0
WireConnection;39;0;34;0
WireConnection;38;0;12;0
ASEEND*/
//CHKSM=D24C8BF7840C56CD057B1AAEC0FA1C82BDCD7B7D