90 lines
2.6 KiB
HLSL
90 lines
2.6 KiB
HLSL
//-----------------------------------------------------------------------------
|
|
// Copyright(C) Yan Verde - All Rights Reserved
|
|
// Copyright protected under Unity Asset Store EULA
|
|
// Refer to https://unity3d.com/legal/as_terms for more informations
|
|
// -----------------------------------------------------------------------------
|
|
// URP Water
|
|
// Author : Yan Verde
|
|
// Date : April 10, 2021
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef URPWATER_SCATTERING_INCLUDED
|
|
#define URPWATER_SCATTERING_INCLUDED
|
|
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
#include "URPWaterVariables.hlsl"
|
|
#include "URPWaterHelpers.hlsl"
|
|
|
|
|
|
void ComputeScattering(inout GlobalData data, Varyings IN)
|
|
{
|
|
#if _SCATTERING_ON
|
|
|
|
Light mainLight = data.mainLight;
|
|
half3 lightColor = mainLight.color;
|
|
|
|
// ==================================
|
|
// Scattering
|
|
// ==================================
|
|
half3 L = mainLight.direction;
|
|
half3 V = data.worldViewDir;
|
|
half3 N = lerp(half3(0,1,0), data.worldNormal, _CapsScatterNormals * 0.1);
|
|
|
|
#if _DOUBLE_SIDED_ON
|
|
L.y = lerp(-L.y, L.y, data.vFace);
|
|
#endif
|
|
|
|
|
|
half3 H = normalize(L + N);
|
|
half VdotH = max(0, dot(V, -H));
|
|
VdotH = smoothstep(_ScatteringRangeMin, _ScatteringRangeMax, VdotH);
|
|
|
|
half scatterMask = saturate(VdotH * _ScatteringIntensity);
|
|
|
|
// ===================================
|
|
// Caps Scattering
|
|
// ===================================
|
|
|
|
#if _DISPLACEMENTMODE_GERSTNER || _DISPLACEMENTMODE_GERSTNERPLUS
|
|
#if _CAPS_SCATTERING_ON
|
|
|
|
half capsMask = smoothstep(_CapsScatteringRangeMin, _CapsScatteringRangeMax, saturate(IN.texcoord3.y));
|
|
|
|
|
|
half3 capsNormals = lerp(half3(0, 1, 0), data.worldNormal, _CapsScatterNormals);
|
|
//half NdotL = saturate(dot(IN.normal.xyz, -L) * 0.5 + 0.5);
|
|
half NdotV = saturate(dot(IN.normal.xyz, V));
|
|
half NdotV2 = saturate(dot(capsNormals, V));
|
|
|
|
half fresnel = max(0, pow(NdotV,4) * NdotV2 );
|
|
half topDownMask = saturate(dot(float3(0, 1, 0), -GetViewForwardDir()));
|
|
|
|
fresnel *= 1 - smoothstep(0.5, 1, topDownMask);
|
|
half finalCapsMask = saturate(fresnel) * capsMask * _CapsScatteringIntensity;
|
|
|
|
scatterMask += finalCapsMask;
|
|
|
|
|
|
//data.debug.rgb = scatterMask;
|
|
#endif
|
|
#endif
|
|
|
|
// ==================================
|
|
// Output
|
|
// ==================================
|
|
|
|
//data.debug.rgb = scatterMask;
|
|
|
|
half3 scatterColor = _ScatteringColor.rgb * saturate(scatterMask);
|
|
data.scattering = scatterColor * saturate(lightColor);
|
|
|
|
#if _DOUBLE_SIDED_ON
|
|
data.scattering = lerp(data.scattering * 0.25, data.scattering, data.vFace);
|
|
#endif
|
|
|
|
|
|
#endif
|
|
}
|
|
|
|
#endif |