Created
September 29, 2016 03:37
-
-
Save RoryDungan/322e53305aec352f74a7ecfc5a7bde0d to your computer and use it in GitHub Desktop.
Unity 5.3+ cel shading
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Shader "Custom/Internal-DeferredShading" { | |
Properties { | |
_LightTexture0 ("", any) = "" {} | |
_LightTextureB0 ("", 2D) = "" {} | |
_ShadowMapTexture ("", any) = "" {} | |
_SrcBlend ("", Float) = 1 | |
_DstBlend ("", Float) = 1 | |
} | |
SubShader { | |
// Pass 1: Lighting pass | |
// LDR case - Lighting encoded into a subtractive ARGB8 buffer | |
// HDR case - Lighting additively blended into floating point buffer | |
Pass { | |
ZWrite Off | |
Blend [_SrcBlend] [_DstBlend] | |
CGPROGRAM | |
// Override UNITY_BRDF_PBS to exclude BRDF1_Unity_PBS variant, | |
// otherwise, it mimics the definition from UnityPBSLighting.cginc. | |
#if SHADER_TARGET < 30 && !UNITY_53_SPECIFIC_TARGET_WEBGL | |
#define UNITY_BRDF_PBS BRDF3_Unity_PBS | |
#elif UNITY_PBS_USE_BRDF3 | |
#define UNITY_BRDF_PBS BRDF3_Unity_PBS | |
#else | |
#define UNITY_BRDF_PBS BRDF2_Unity_PBS | |
#endif | |
#pragma target 3.0 | |
#pragma vertex vert_deferred | |
#pragma fragment frag | |
#pragma multi_compile_lightpass | |
#pragma multi_compile ___ UNITY_HDR_ON | |
#pragma exclude_renderers nomrt | |
#include "UnityCG.cginc" | |
#include "UnityDeferredLibrary.cginc" | |
#include "UnityPBSLighting.cginc" | |
#include "UnityStandardUtils.cginc" | |
#include "UnityStandardBRDF.cginc" | |
sampler2D _CameraGBufferTexture0; | |
sampler2D _CameraGBufferTexture1; | |
sampler2D _CameraGBufferTexture2; | |
half4 CalculateLight (unity_v2f_deferred i) | |
{ | |
float3 wpos; | |
float2 uv; | |
float atten, fadeDist; | |
UnityLight light; | |
UNITY_INITIALIZE_OUTPUT(UnityLight, light); | |
UnityDeferredCalculateLightParams (i, wpos, uv, light.dir, atten, fadeDist); | |
half4 gbuffer0 = tex2D (_CameraGBufferTexture0, uv); | |
half4 gbuffer1 = tex2D (_CameraGBufferTexture1, uv); | |
half4 gbuffer2 = tex2D (_CameraGBufferTexture2, uv); | |
light.color = _LightColor.rgb * atten; | |
half3 baseColor = gbuffer0.rgb; | |
half3 specColor = gbuffer1.rgb; | |
half oneMinusRoughness = gbuffer1.a; | |
half3 normalWorld = gbuffer2.rgb * 2 - 1; | |
normalWorld = normalize(normalWorld); | |
float3 eyeVec = normalize(wpos-_WorldSpaceCameraPos); | |
half oneMinusReflectivity = 1 - SpecularStrength(specColor.rgb); | |
light.ndotl = LambertTerm (normalWorld, light.dir); | |
// Cel shading | |
if (light.ndotl <= 0.0) { | |
light.ndotl = 0; | |
} | |
else { | |
light.ndotl = 1; | |
} | |
UnityIndirect ind; | |
UNITY_INITIALIZE_OUTPUT(UnityIndirect, ind); | |
ind.diffuse = 0; | |
ind.specular = 0; | |
half4 res = UNITY_BRDF_PBS (baseColor, specColor, oneMinusReflectivity, oneMinusRoughness, normalWorld, -eyeVec, light, ind); | |
return res; | |
} | |
#ifdef UNITY_HDR_ON | |
half4 | |
#else | |
fixed4 | |
#endif | |
frag (unity_v2f_deferred i) : SV_Target | |
{ | |
half4 c = CalculateLight(i); | |
#ifdef UNITY_HDR_ON | |
return c; | |
#else | |
return exp2(-c); | |
#endif | |
} | |
ENDCG | |
} | |
// Pass 2: Final decode pass. | |
// Used only with HDR off, to decode the logarithmic buffer into the main RT | |
Pass { | |
ZTest Always Cull Off ZWrite Off | |
Stencil { | |
ref [_StencilNonBackground] | |
readmask [_StencilNonBackground] | |
// Normally just comp would be sufficient, but there's a bug and only front face stencil state is set (case 583207) | |
compback equal | |
compfront equal | |
} | |
CGPROGRAM | |
#pragma target 3.0 | |
#pragma vertex vert | |
#pragma fragment frag | |
#pragma exclude_renderers nomrt | |
#include "UnityCG.cginc" | |
sampler2D _LightBuffer; | |
struct v2f { | |
float4 vertex : SV_POSITION; | |
float2 texcoord : TEXCOORD0; | |
}; | |
v2f vert (float4 vertex : POSITION, float2 texcoord : TEXCOORD0) | |
{ | |
v2f o; | |
o.vertex = UnityObjectToClipPos(vertex); | |
o.texcoord = texcoord.xy; | |
#ifdef UNITY_SINGLE_PASS_STEREO | |
o.texcoord = TransformStereoScreenSpaceTex(o.texcoord, 1.0f); | |
#endif | |
return o; | |
} | |
fixed4 frag (v2f i) : SV_Target | |
{ | |
return -log2(tex2D(_LightBuffer, i.texcoord)); | |
} | |
ENDCG | |
} | |
} | |
Fallback Off | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment