- Shader "FlexibleCelShader/Cel No Outline"
- {
- Properties
- {
- _Color("Global Color Modifier", Color) = (1, 1, 1, 1)
- _MainTex("Texture", 2D) = "white" {}
- _NormalTex("Normal", 2D) = "bump" {}
- _EmmisTex("Emission", 2D) = "black" {}
-
- _RampLevels("Ramp Levels", Range(2, 50)) = 2
- _LightScalar("Light Scalar", Range(0, 10)) = 1
- _HighColor("High Light Color", Color) = (1, 1, 1, 1)
- _HighIntensity("High Light Intensity", Range(0, 10)) = 1.5
- _LowColor("Low Light Color", Color) = (1, 1, 1, 1)
- _LowIntensity("Low Light Intensity", Range(0, 10)) = 1
- _OutlineColor("Outline Color", Color) = (0, 0, 0, 1)
- _OutlineSize("Outline Size", float) = 10
- _RimColor("Hard Edge Light Color", Color) = (1, 1, 1, 1)
- _RimAlpha("Hard Edge Light Brightness", Range(0, 1)) = 0
- _RimPower("Hard Edge Light Size", Range(0,1)) = 0
- _RimDropOff("Hard Edge Light Dropoff", range(0, 1)) = 0
- _FresnelColor("Soft Edge Light Color", Color) = (1,1,1,1)
- _FresnelBrightness("Soft Edge Light Brightness", Range(0, 1)) = 0
- _FresnelPower("Soft Edge Light Size", Range(0, 1)) = 0
- _FresnelShadowDropoff("Soft Edge Light Dropoff", range(0, 1)) = 0
- }
-
- SubShader
- {
-
-
- Cull back
- Pass
- {
- Tags{ "LightMode" = "ForwardBase" }
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- #include "Lighting.cginc"
- #pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight
- #include "AutoLight.cginc"
- struct v2f
- {
- float2 uv : TEXCOORD0;
- SHADOW_COORDS(1)
- float3 worldNormal : TEXCOORD2;
- float3 worldTangent : TEXCOORD3;
- float3 worldBitangent : TEXCOORD4;
- float4 worldPos : TEXCOORD5;
- float4 pos : SV_POSITION;
- };
- v2f vert(appdata_tan v)
- {
- v2f o;
-
- o.uv = v.texcoord;
-
- o.worldPos = mul(unity_ObjectToWorld, v.vertex);
- o.pos = mul(UNITY_MATRIX_VP, o.worldPos);
-
- o.worldNormal = UnityObjectToWorldNormal(v.normal);
- o.worldTangent = UnityObjectToWorldNormal(v.tangent);
- o.worldBitangent = cross(o.worldTangent, o.worldNormal);
-
-
- TRANSFER_SHADOW(o);
- return o;
- }
- float4 _Color;
- sampler2D _MainTex;
- uniform float4 _MainTex_ST;
- sampler2D _NormalTex;
- uniform float4 _NormalTex_ST;
- sampler2D _EmmisTex;
- uniform float4 _EmmisTex_ST;
- int _RampLevels;
- float _LightScalar;
- float _HighIntensity;
- float4 _HighColor;
- float _LowIntensity;
- float4 _LowColor;
- float _RimPower;
- float _RimAlpha;
- float4 _RimColor;
- float _RimDropOff;
- float _FresnelBrightness;
- float _FresnelPower;
- float4 _FresnelColor;
- float _FresnelShadowDropoff;
- fixed4 frag(v2f i) : SV_Target
- {
- _RampLevels -= 1;
-
- float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
- float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);
-
- fixed4 col = tex2D(_MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw);
- fixed3 tangentNormal = tex2D(_NormalTex, i.uv * _NormalTex_ST.xy + _NormalTex_ST.zw) * 2 - 1;
- fixed4 emmision = tex2D(_EmmisTex, i.uv * _EmmisTex_ST.xy + _EmmisTex_ST.zw);
-
- float3 worldNormal = float3(i.worldTangent * tangentNormal.r + i.worldBitangent * tangentNormal.g + i.worldNormal * tangentNormal.b);
-
- half factor = dot(viewDirection, worldNormal);
- half fresnelFactor = 1 - min(pow(max(1 - factor, 0), (1 - _FresnelPower) * 10), 1);
-
- fixed shadow = SHADOW_ATTENUATION(i);
-
- float intensity = dot(worldNormal, lightDirection);
- intensity = clamp(intensity * _LightScalar, 0, 1);
-
-
- intensity *= shadow;
-
-
- float rampLevel = round(intensity * _RampLevels);
-
-
- float lightMultiplier = _LowIntensity + ((_HighIntensity - _LowIntensity) / (_RampLevels)) * rampLevel;
-
- float4 highColor = (rampLevel / _RampLevels) * _HighColor;
- float4 lowColor = ((_RampLevels - rampLevel) / _RampLevels) * _LowColor;
- float4 mixColor = (highColor + lowColor) / 2;
-
-
- col *= lightMultiplier;
- col *= _Color * mixColor;
-
- float rampPercentSoftFresnel = 1 - ((1 - rampLevel / _RampLevels) * (1 - _FresnelShadowDropoff));
- col.rgb = col.rgb + _FresnelColor*(_FresnelBrightness*10 - fresnelFactor*_FresnelBrightness*10) * rampPercentSoftFresnel;
-
- _RimAlpha *= 1 - ((1 - rampLevel / _RampLevels) * (1 - _RimDropOff));
- if (factor <= _RimPower) {
- col.rgb = _RimColor.rgb * _RimAlpha + col.rgb * (1 - _RimAlpha);
- }
-
- half eIntensity = max(emmision.r, emmision.g);
- eIntensity = max(eIntensity, emmision.b);
- col = emmision*eIntensity + col*(1 - eIntensity);
- return col;
- }
-
- ENDCG
- }
-
- UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"
- }
- CustomEditor "CelCustomEditor"
- }