145 lines
5.3 KiB
HLSL
145 lines
5.3 KiB
HLSL
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// NOTICE:
|
||
// All functions in this file are deprecated and should not be use, they will be remove in a later version.
|
||
// They are let here for backward compatibility.
|
||
// This file gather several function related to different part of shader code like BRDF or image based lighting
|
||
// to avoid to create multiple deprecated file, this file include deprecated function based on a define
|
||
// to when including this file, it is expected that the caller define which deprecated function group he want to enable
|
||
// Example, following code will include all deprecated BRDF functions:
|
||
// #define INCLUDE_UNITY_STANDARD_BRDF_DEPRECATED
|
||
// #include "UnityDeprecated.cginc"
|
||
// #undef INCLUDE_UNITY_STANDARD_BRDF_DEPRECATED
|
||
//-----------------------------------------------------------------------------
|
||
|
||
#ifdef INCLUDE_UNITY_STANDARD_BRDF_DEPRECATED
|
||
|
||
inline half3 LazarovFresnelTerm (half3 F0, half roughness, half cosA)
|
||
{
|
||
half t = Pow5 (1 - cosA); // ala Schlick interpoliation
|
||
t /= 4 - 3 * roughness;
|
||
return F0 + (1-F0) * t;
|
||
}
|
||
inline half3 SebLagardeFresnelTerm (half3 F0, half roughness, half cosA)
|
||
{
|
||
half t = Pow5 (1 - cosA); // ala Schlick interpoliation
|
||
return F0 + (max (F0, roughness) - F0) * t;
|
||
}
|
||
|
||
// Cook-Torrance visibility term, doesn't take roughness into account
|
||
inline half CookTorranceVisibilityTerm (half NdotL, half NdotV, half NdotH, half VdotH)
|
||
{
|
||
VdotH += 1e-5f;
|
||
half G = min (1.0, min (
|
||
(2.0 * NdotH * NdotV) / VdotH,
|
||
(2.0 * NdotH * NdotL) / VdotH));
|
||
return G / (NdotL * NdotV + 1e-4f);
|
||
}
|
||
|
||
// Kelemen-Szirmay-Kalos is an approximation to Cook-Torrance visibility term
|
||
// http://sirkan.iit.bme.hu/~szirmay/scook.pdf
|
||
inline half KelemenVisibilityTerm (half LdotH)
|
||
{
|
||
return 1.0 / (LdotH * LdotH);
|
||
}
|
||
|
||
// Modified Kelemen-Szirmay-Kalos which takes roughness into account, based on: http://www.filmicworlds.com/2014/04/21/optimizing-ggx-shaders-with-dotlh/
|
||
inline half ModifiedKelemenVisibilityTerm (half LdotH, half perceptualRoughness)
|
||
{
|
||
half c = 0.797884560802865h; // c = sqrt(2 / Pi)
|
||
half k = PerceptualRoughnessToRoughness(perceptualRoughness) * c;
|
||
half gH = LdotH * (1-k) + k;
|
||
return 1.0 / (gH * gH);
|
||
}
|
||
|
||
// Smith-Schlick derived for GGX
|
||
inline half SmithGGXVisibilityTerm (half NdotL, half NdotV, half perceptualRoughness)
|
||
{
|
||
half k = (PerceptualRoughnessToRoughness(perceptualRoughness)) / 2; // derived by B. Karis, http://graphicrants.blogspot.se/2013/08/specular-brdf-reference.html
|
||
return SmithVisibilityTerm (NdotL, NdotV, k);
|
||
}
|
||
|
||
inline half ImplicitVisibilityTerm ()
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
// BlinnPhong normalized as reflection densitysity function (RDF)
|
||
// ready for use directly as specular: spec=D
|
||
// http://www.thetenthplanet.de/archives/255
|
||
inline half RDFBlinnPhongNormalizedTerm (half NdotH, half n)
|
||
{
|
||
half normTerm = (n + 2.0) / (8.0 * UNITY_PI);
|
||
half specTerm = pow (NdotH, n);
|
||
return specTerm * normTerm;
|
||
}
|
||
|
||
// Decodes HDR textures
|
||
// sm 2.0 is no longer supported
|
||
inline half3 DecodeHDR_NoLinearSupportInSM2 (half4 data, half4 decodeInstructions)
|
||
{
|
||
// If Linear mode is not supported we can skip exponent part
|
||
// In Standard shader SM2.0 and SM3.0 paths are always using different shader variations
|
||
// SM2.0: hardware does not support Linear, we can skip exponent part
|
||
#if defined(UNITY_COLORSPACE_GAMMA) && (SHADER_TARGET < 30)
|
||
return (data.a * decodeInstructions.x) * data.rgb;
|
||
#else
|
||
return DecodeHDR(data, decodeInstructions);
|
||
#endif
|
||
}
|
||
|
||
inline half DotClamped (half3 a, half3 b)
|
||
{
|
||
#if (SHADER_TARGET < 30)
|
||
return saturate(dot(a, b));
|
||
#else
|
||
return max(0.0h, dot(a, b));
|
||
#endif
|
||
}
|
||
|
||
inline half LambertTerm (half3 normal, half3 lightDir)
|
||
{
|
||
return DotClamped (normal, lightDir);
|
||
}
|
||
|
||
inline half BlinnTerm (half3 normal, half3 halfDir)
|
||
{
|
||
return DotClamped (normal, halfDir);
|
||
}
|
||
|
||
half RoughnessToSpecPower (half roughness)
|
||
{
|
||
return PerceptualRoughnessToSpecPower (roughness);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------
|
||
// Legacy, to keep backwards compatibility for (pre Unity 5.3) custom user shaders:
|
||
#ifdef UNITY_COLORSPACE_GAMMA
|
||
# define unity_LightGammaCorrectionConsts_PIDiv4 ((UNITY_PI/4)*(UNITY_PI/4))
|
||
# define unity_LightGammaCorrectionConsts_HalfDivPI ((.5h/UNITY_PI)*(.5h/UNITY_PI))
|
||
# define unity_LightGammaCorrectionConsts_8 (8*8)
|
||
# define unity_LightGammaCorrectionConsts_SqrtHalfPI (2/UNITY_PI)
|
||
#else
|
||
# define unity_LightGammaCorrectionConsts_PIDiv4 (UNITY_PI/4)
|
||
# define unity_LightGammaCorrectionConsts_HalfDivPI (.5h/UNITY_PI)
|
||
# define unity_LightGammaCorrectionConsts_8 (8)
|
||
# define unity_LightGammaCorrectionConsts_SqrtHalfPI (0.79788)
|
||
#endif
|
||
|
||
#endif // INCLUDE_UNITY_STANDARD_BRDF_DEPRECATED
|
||
|
||
#ifdef INCLUDE_UNITY_IMAGE_BASED_LIGHTING_DEPRECATED
|
||
|
||
// Old Unity_GlossyEnvironment signature. Kept only for backward compatibility and will be removed soon
|
||
half3 Unity_GlossyEnvironment (UNITY_ARGS_TEXCUBE(tex), half4 hdr, half3 worldNormal, half perceptualRoughness)
|
||
{
|
||
Unity_GlossyEnvironmentData g;
|
||
g.roughness /* perceptualRoughness */ = perceptualRoughness;
|
||
g.reflUVW = worldNormal;
|
||
|
||
return Unity_GlossyEnvironment (UNITY_PASS_TEXCUBE(tex), hdr, g);
|
||
}
|
||
|
||
#endif // INCLUDE_UNITY_IMAGE_BASED_LIGHTING_DEPRECATED
|