124 lines
4.7 KiB
HLSL
124 lines
4.7 KiB
HLSL
|
#ifndef LIGHTING
|
||
|
#define LIGHTING
|
||
|
|
||
|
int _LightingType;
|
||
|
sampler2D _ToonRamp;
|
||
|
float _AdditiveSoftness;
|
||
|
float _AdditiveOffset;
|
||
|
float _ForceLightDirection;
|
||
|
float _ShadowStrength;
|
||
|
float _OutlineShadowStrength;
|
||
|
float _ShadowOffset;
|
||
|
float3 _LightDirection;
|
||
|
float _ForceShadowStrength;
|
||
|
float _CastedShadowSmoothing;
|
||
|
float _MinBrightness;
|
||
|
float _MaxBrightness;
|
||
|
float _IndirectContribution;
|
||
|
float _AttenuationMultiplier;
|
||
|
|
||
|
UNITY_DECLARE_TEX2D_NOSAMPLER(_AOMap); float4 _AOMap_ST;
|
||
|
float _AOStrength;
|
||
|
|
||
|
float3 ShadeSH9Indirect()
|
||
|
{
|
||
|
return ShadeSH9(half4(0.0, -1.0, 0.0, 1.0));
|
||
|
}
|
||
|
|
||
|
float3 ShadeSH9Direct()
|
||
|
{
|
||
|
return ShadeSH9(half4(0.0, 1.0, 0.0, 1.0));
|
||
|
}
|
||
|
|
||
|
float3 ShadeSH9Normal(float3 normalDirection)
|
||
|
{
|
||
|
return ShadeSH9(half4(normalDirection, 1.0));
|
||
|
}
|
||
|
|
||
|
half3 GetSHLength()
|
||
|
{
|
||
|
half3 x, x1;
|
||
|
x.r = length(unity_SHAr);
|
||
|
x.g = length(unity_SHAg);
|
||
|
x.b = length(unity_SHAb);
|
||
|
x1.r = length(unity_SHBr);
|
||
|
x1.g = length(unity_SHBg);
|
||
|
x1.b = length(unity_SHBb);
|
||
|
return x + x1;
|
||
|
}
|
||
|
|
||
|
float FadeShadows(float attenuation, float3 worldPosition)
|
||
|
{
|
||
|
float viewZ = dot(_WorldSpaceCameraPos - worldPosition, UNITY_MATRIX_V[2].xyz);
|
||
|
float shadowFadeDistance = UnityComputeShadowFadeDistance(worldPosition, viewZ);
|
||
|
float shadowFade = UnityComputeShadowFade(shadowFadeDistance);
|
||
|
attenuation = saturate(attenuation + shadowFade);
|
||
|
return attenuation;
|
||
|
}
|
||
|
|
||
|
float calculateAOMap(float AOMap, float AOStrength)
|
||
|
{
|
||
|
return lerp(1, AOMap, AOStrength);
|
||
|
}
|
||
|
|
||
|
void calculateBasePassLighting(float3 normal, float2 uv)
|
||
|
{
|
||
|
poiLight.direction = _WorldSpaceLightPos0;
|
||
|
poiLight.nDotL = dot(normal, poiLight.direction);
|
||
|
float AOMap = 1;
|
||
|
#ifndef OUTLINE
|
||
|
AOMap = UNITY_SAMPLE_TEX2D_SAMPLER(_AOMap, _MainTex, TRANSFORM_TEX(uv, _AOMap));
|
||
|
AOMap = calculateAOMap(AOMap, _AOStrength);
|
||
|
#endif
|
||
|
|
||
|
float3 grayscale_vector = grayscale_for_light();
|
||
|
float3 ShadeSH9Plus = GetSHLength();
|
||
|
float3 ShadeSH9Minus = ShadeSH9(float4(0, 0, 0, 1));
|
||
|
poiLight.directLighting = ShadeSH9Plus + poiLight.color;
|
||
|
poiLight.indirectLighting = ShadeSH9Minus;
|
||
|
|
||
|
float bw_lightColor = dot(poiLight.color, grayscale_vector);
|
||
|
float bw_directLighting = (((poiLight.nDotL * 0.5 + 0.5) * bw_lightColor * lerp(1, poiLight.attenuation, _AttenuationMultiplier)) + dot(ShadeSH9Normal(normal), grayscale_vector));
|
||
|
float bw_bottomIndirectLighting = dot(ShadeSH9Minus, grayscale_vector);
|
||
|
float bw_topIndirectLighting = dot(ShadeSH9Plus, grayscale_vector);
|
||
|
float lightDifference = ((bw_topIndirectLighting + bw_lightColor) - bw_bottomIndirectLighting);
|
||
|
poiLight.lightMap = smoothstep(0, lightDifference, bw_directLighting - bw_bottomIndirectLighting);
|
||
|
poiLight.rampedLightMap = tex2D(_ToonRamp, poiLight.lightMap + _ShadowOffset);
|
||
|
|
||
|
if (_LightingType == 0)
|
||
|
{
|
||
|
poiLight.finalLighting = lerp(saturate(poiLight.indirectLighting), lerp(poiLight.directLighting, poiLight.indirectLighting, _IndirectContribution), lerp(1, poiLight.rampedLightMap, _ShadowStrength)) * AOMap;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
poiLight.finalLighting = saturate(poiLight.directLighting) * lerp(1, poiLight.rampedLightMap, _ShadowStrength) * AOMap;
|
||
|
}
|
||
|
|
||
|
poiLight.finalLighting = clamp(poiLight.finalLighting, _MinBrightness, _MaxBrightness);
|
||
|
}
|
||
|
|
||
|
void calculateLighting(v2f i)
|
||
|
{
|
||
|
#ifdef OUTLINE
|
||
|
_ShadowStrength = _OutlineShadowStrength;
|
||
|
#endif
|
||
|
UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos.xyz)
|
||
|
poiLight.attenuation = FadeShadows(attenuation, i.worldPos.xyz);
|
||
|
poiLight.color = _LightColor0.rgb;
|
||
|
#ifdef FORWARD_BASE_PASS
|
||
|
calculateBasePassLighting(i.normal, i.uv);
|
||
|
#else
|
||
|
#if defined(POINT) || defined(SPOT)
|
||
|
poiLight.position = _WorldSpaceLightPos0.xyz;
|
||
|
poiLight.direction = normalize(poiLight.position - i.worldPos);
|
||
|
poiLight.nDotL = dot(i.normal, poiLight.direction);
|
||
|
poiLight.finalLighting = poiLight.color * poiLight.attenuation * smoothstep(.5 - _AdditiveSoftness + _AdditiveOffset, .5 + _AdditiveSoftness + _AdditiveOffset, .5 * poiLight.nDotL + .5);
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void applyLighting(inout float4 finalColor)
|
||
|
{
|
||
|
finalColor.rgb *= poiLight.finalLighting;
|
||
|
}
|
||
|
#endif
|