You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.5 KiB
88 lines
3.5 KiB
#ifndef UNITY_ATMOSPHERIC_SCATTERING_RAY_TRACING_INCLUDED
|
|
#define UNITY_ATMOSPHERIC_SCATTERING_RAY_TRACING_INCLUDED
|
|
|
|
#include "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/AtmosphericScattering/AtmosphericScattering.hlsl"
|
|
|
|
float GetHeightFogTransmittance(float3 origin, float3 direction, float t)
|
|
{
|
|
float cosZenith = dot(direction, _PlanetUp);
|
|
float startHeight = dot(origin, _PlanetUp);
|
|
|
|
return TransmittanceHeightFog(_HeightFogBaseExtinction, _HeightFogBaseHeight, _HeightFogExponents, cosZenith, startHeight, min(t, _MaxFogDistance));
|
|
}
|
|
|
|
float3 GetHeightFogColor(float3 direction, float t)
|
|
{
|
|
return GetFogColor(-direction, min(t, _MaxFogDistance)) * _HeightFogBaseScattering.xyz / _HeightFogBaseExtinction;
|
|
}
|
|
|
|
// Used in path tracing
|
|
void ApplyFogAttenuation(float3 origin, float3 direction, float t, inout float3 value, inout float3 unlitShadowColor, inout float alpha, inout float alphaShadowTint, inout float3 throughput, inout float3 segmentThroughput, inout float3 neeValue, bool useFogColor = true)
|
|
{
|
|
if (_FogEnabled)
|
|
{
|
|
float fogTransmittance = GetHeightFogTransmittance(origin, direction, t);
|
|
float3 fogColor = useFogColor? GetHeightFogColor(direction, t) : 0.0;
|
|
|
|
value = lerp(fogColor, value, fogTransmittance);
|
|
unlitShadowColor = lerp(fogColor, unlitShadowColor, fogTransmittance);
|
|
alpha = saturate(1.0 - fogTransmittance) + fogTransmittance * alpha;
|
|
alphaShadowTint = saturate(1.0 - fogTransmittance) + fogTransmittance * alphaShadowTint;
|
|
throughput *= fogTransmittance;
|
|
segmentThroughput *= fogTransmittance;
|
|
neeValue *= fogTransmittance;
|
|
}
|
|
}
|
|
|
|
void ApplyFogAttenuation(float3 origin, float3 direction, float t, inout float3 value, inout float3 unlitShadowColor, inout float alpha, inout float3 throughput, bool useFogColor = true)
|
|
{
|
|
if (_FogEnabled)
|
|
{
|
|
float fogTransmittance = GetHeightFogTransmittance(origin, direction, t);
|
|
float3 fogColor = useFogColor? GetHeightFogColor(direction, t) : 0.0;
|
|
|
|
value = lerp(fogColor, value, fogTransmittance);
|
|
unlitShadowColor = lerp(fogColor, unlitShadowColor, fogTransmittance);
|
|
alpha = saturate(1.0 - fogTransmittance) + fogTransmittance * alpha;
|
|
throughput *= fogTransmittance;
|
|
}
|
|
}
|
|
|
|
// Used on transmission rays of local lights
|
|
void ApplyFogAttenuation(float3 origin, float3 direction, float t, inout float3 value, bool useFogColor = true)
|
|
{
|
|
if (_FogEnabled)
|
|
{
|
|
float fogTransmittance = GetHeightFogTransmittance(origin, direction, t);
|
|
float3 fogColor = useFogColor? GetHeightFogColor(direction, t) : 0.0;
|
|
|
|
value = lerp(fogColor, value, fogTransmittance);
|
|
}
|
|
}
|
|
|
|
// Used on transmission rays of distant lights
|
|
void ApplyFogAttenuation(float3 origin, float3 direction, inout float3 value)
|
|
{
|
|
if (_FogEnabled)
|
|
{
|
|
float fogTransmittance = GetHeightFogTransmittance(origin, direction, _MipFogFar);
|
|
float3 fogColor = GetHeightFogColor(direction, _MipFogFar);
|
|
|
|
value = lerp(fogColor, value, fogTransmittance);
|
|
}
|
|
}
|
|
|
|
// Used on camera rays
|
|
void ApplyFogAttenuation(float3 origin, float3 direction, inout float3 value, inout float alpha)
|
|
{
|
|
if (_FogEnabled)
|
|
{
|
|
float fogTransmittance = GetHeightFogTransmittance(origin, direction, _MipFogFar);
|
|
float3 fogColor = GetHeightFogColor(direction, _MipFogFar);
|
|
|
|
value = lerp(fogColor, value, fogTransmittance);
|
|
alpha = saturate(1.0 - fogTransmittance) + fogTransmittance * alpha;
|
|
}
|
|
}
|
|
|
|
#endif // UNITY_ATMOSPHERIC_SCATTERING_RAY_TRACING_INCLUDED
|