You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			102 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
| 
								 
											1 year ago
										 
									 | 
							
								void VertShader(inout appdata_full v, out Input data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									v.vertex.x += _VertexOffsetX;
							 | 
						||
| 
								 | 
							
									v.vertex.y += _VertexOffsetY;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									UNITY_INITIALIZE_OUTPUT(Input, data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									float bold = step(v.texcoord1.y, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Generate normal for backface
							 | 
						||
| 
								 | 
							
									float3 view = ObjSpaceViewDir(v.vertex);
							 | 
						||
| 
								 | 
							
									v.normal *= sign(dot(v.normal, view));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if USE_DERIVATIVE
							 | 
						||
| 
								 | 
							
									data.param.y = 1;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
									float4 vert = v.vertex;
							 | 
						||
| 
								 | 
							
									float4 vPosition = UnityObjectToClipPos(vert);
							 | 
						||
| 
								 | 
							
									float2 pixelSize = vPosition.w;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy);
							 | 
						||
| 
								 | 
							
									float scale = rsqrt(dot(pixelSize, pixelSize));
							 | 
						||
| 
								 | 
							
									scale *= abs(v.texcoord1.y) * _GradientScale * (_Sharpness + 1);
							 | 
						||
| 
								 | 
							
									scale = lerp(scale * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
							 | 
						||
| 
								 | 
							
									data.param.y = scale;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; // 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									v.texcoord1.xy = UnpackUV(v.texcoord1.x);
							 | 
						||
| 
								 | 
							
									data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void PixShader(Input input, inout SurfaceOutput o)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if USE_DERIVATIVE
							 | 
						||
| 
								 | 
							
									float2 pixelSize = float2(ddx(input.uv_MainTex.y), ddy(input.uv_MainTex.y));
							 | 
						||
| 
								 | 
							
									pixelSize *= _TextureWidth * .75;
							 | 
						||
| 
								 | 
							
									float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
									float scale = input.param.y;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Signed distance
							 | 
						||
| 
								 | 
							
									float c = tex2D(_MainTex, input.uv_MainTex).a;
							 | 
						||
| 
								 | 
							
									float sd = (.5 - c - input.param.x) * scale + .5;
							 | 
						||
| 
								 | 
							
									float outline = _OutlineWidth*_ScaleRatioA * scale;
							 | 
						||
| 
								 | 
							
									float softness = _OutlineSoftness*_ScaleRatioA * scale;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Color & Alpha
							 | 
						||
| 
								 | 
							
									float4 faceColor = _FaceColor;
							 | 
						||
| 
								 | 
							
									float4 outlineColor = _OutlineColor;
							 | 
						||
| 
								 | 
							
									faceColor *= input.color;
							 | 
						||
| 
								 | 
							
									outlineColor.a *= input.color.a;
							 | 
						||
| 
								 | 
							
									faceColor *= tex2D(_FaceTex, float2(input.uv2_FaceTex.x + _FaceUVSpeedX * _Time.y, input.uv2_FaceTex.y + _FaceUVSpeedY * _Time.y));
							 | 
						||
| 
								 | 
							
									outlineColor *= tex2D(_OutlineTex, float2(input.uv2_OutlineTex.x + _OutlineUVSpeedX * _Time.y, input.uv2_OutlineTex.y + _OutlineUVSpeedY * _Time.y));
							 | 
						||
| 
								 | 
							
									faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
							 | 
						||
| 
								 | 
							
									faceColor.rgb /= max(faceColor.a, 0.0001);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if BEVEL_ON
							 | 
						||
| 
								 | 
							
									float3 delta = float3(1.0 / _TextureWidth, 1.0 / _TextureHeight, 0.0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									float4 smp4x = {tex2D(_MainTex, input.uv_MainTex - delta.xz).a,
							 | 
						||
| 
								 | 
							
													tex2D(_MainTex, input.uv_MainTex + delta.xz).a,
							 | 
						||
| 
								 | 
							
													tex2D(_MainTex, input.uv_MainTex - delta.zy).a,
							 | 
						||
| 
								 | 
							
													tex2D(_MainTex, input.uv_MainTex + delta.zy).a };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Face Normal
							 | 
						||
| 
								 | 
							
									float3 n = GetSurfaceNormal(smp4x, input.param.x);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Bumpmap
							 | 
						||
| 
								 | 
							
									float3 bump = UnpackNormal(tex2D(_BumpMap, input.uv2_FaceTex.xy)).xyz;
							 | 
						||
| 
								 | 
							
									bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
							 | 
						||
| 
								 | 
							
									bump = lerp(float3(0, 0, 1), bump, faceColor.a);
							 | 
						||
| 
								 | 
							
									n = normalize(n - bump);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Cubemap reflection
							 | 
						||
| 
								 | 
							
									fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDirEnv, mul((float3x3)unity_ObjectToWorld, n)));
							 | 
						||
| 
								 | 
							
									float3 emission = reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
									float3 n = float3(0, 0, -1);
							 | 
						||
| 
								 | 
							
									float3 emission = float3(0, 0, 0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								#if GLOW_ON
							 | 
						||
| 
								 | 
							
									float4 glowColor = GetGlowColor(sd, scale);
							 | 
						||
| 
								 | 
							
									glowColor.a *= input.color.a;
							 | 
						||
| 
								 | 
							
									emission += glowColor.rgb*glowColor.a;
							 | 
						||
| 
								 | 
							
									faceColor = BlendARGB(glowColor, faceColor);
							 | 
						||
| 
								 | 
							
									faceColor.rgb /= max(faceColor.a, 0.0001);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Set Standard output structure
							 | 
						||
| 
								 | 
							
									o.Albedo = faceColor.rgb;
							 | 
						||
| 
								 | 
							
									o.Normal = -n;
							 | 
						||
| 
								 | 
							
									o.Emission = emission;
							 | 
						||
| 
								 | 
							
									o.Specular = lerp(_FaceShininess, _OutlineShininess, saturate(sd + outline * 0.5));
							 | 
						||
| 
								 | 
							
									o.Gloss = 1;
							 | 
						||
| 
								 | 
							
									o.Alpha = faceColor.a;
							 | 
						||
| 
								 | 
							
								}
							 |