Files
3d-bianpo/Assets/URPWater/Shaders/HLSL/Includes/URPWaterScattering.hlsl
2026-03-03 11:30:53 +08:00

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