上海虹口龙之梦项目
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.
 
 
 
 

85 lines
3.5 KiB

#include "Assets/Azure[Sky] Dynamic Skybox/Shaders/Transparent/AzureComputeFogScattering.cginc"
// Apply fog scattering.
float4 ApplyAzureFog (float4 fragOutput, float3 worldPos)
{
#ifdef UNITY_PASS_FORWARDADD
float3 fogScatteringColor = 0;
#else
float3 fogScatteringColor = AzureComputeFogScattering(worldPos);
#endif
// Calcule Standard Fog.
float depth = distance(_WorldSpaceCameraPos, worldPos);
float fog = smoothstep(-_Azure_FogBlend, 1.25, depth / _Azure_FogDistance) * _Azure_FogDensity;
float heightFogDistance = smoothstep(-_Azure_HeightFogBlend, 1.25, depth / _Azure_HeightFogDistance);
// Calcule Height Fog.
float3 worldSpaceDirection = mul((float3x3)_Azure_UpMatrix, worldPos.xyz);
float heightFog = saturate((worldSpaceDirection.y - _Azure_HeightFogStart) / (_Azure_HeightFogEnd + _Azure_HeightFogStart));
heightFog = 1.0 - heightFog;
heightFog *= heightFog;
heightFog *= heightFogDistance;
float fogFactor = saturate(fog + heightFog * _Azure_HeightFogDensity);
// Apply Fog.
#if defined(_ALPHAPREMULTIPLY_ON)
fragOutput.a = lerp(fragOutput.a, 1.0, fogFactor);
#endif
fogScatteringColor = lerp(fragOutput.rgb, fogScatteringColor, fogFactor * lerp(fragOutput.a, 1.0, 2.0 - fogFactor));
return float4(fogScatteringColor, fragOutput.a);
}
// Apply fog scattering to additive/multiply blend mode.
float4 ApplyAzureFog (float4 fragOutput, float3 worldPos, float4 fogColor)
{
#ifdef UNITY_PASS_FORWARDADD
float3 fogScatteringColor = 0;
#else
float3 fogScatteringColor = fogColor;
#endif
// Calcule Standard Fog.
float depth = distance(_WorldSpaceCameraPos, worldPos);
float fog = smoothstep(-_Azure_FogBlend, 1.25, depth / _Azure_FogDistance) * _Azure_FogDensity;
float heightFogDistance = smoothstep(-_Azure_HeightFogBlend, 1.25, depth / _Azure_HeightFogDistance);
// Calcule Height Fog.
float3 worldSpaceDirection = mul((float3x3)_Azure_UpMatrix, worldPos.xyz);
float heightFog = saturate((worldSpaceDirection.y - _Azure_HeightFogStart) / (_Azure_HeightFogEnd + _Azure_HeightFogStart));
heightFog = 1.0 - heightFog;
heightFog *= heightFog;
heightFog *= heightFogDistance;
float fogFactor = saturate(fog + heightFog * _Azure_HeightFogDensity);
// Apply Fog.
fogScatteringColor = lerp(fragOutput.rgb, fogScatteringColor, fogFactor * lerp(fragOutput.a, 1.0, 2.0 - fogFactor));
return float4(fogScatteringColor, fragOutput.a);
}
// DEPRECATED - backward compatibility (Actually, the projPos parameter is no longer needed.)
float4 ApplyAzureFog (float4 fragOutput, float4 projPos, float3 worldPos)
{
#ifdef UNITY_PASS_FORWARDADD
float3 fogScatteringColor = 0;
#else
float3 fogScatteringColor = AzureComputeFogScattering(worldPos);
#endif
// Calcule Standard Fog.
float depth = distance(_WorldSpaceCameraPos, worldPos);
float fog = smoothstep(-_Azure_FogBlend, 1.25, depth / _Azure_FogDistance) * _Azure_FogDensity;
float heightFogDistance = smoothstep(-_Azure_HeightFogBlend, 1.25, depth / _Azure_HeightFogDistance);
// Calcule Height Fog.
float3 worldSpaceDirection = mul((float3x3)_Azure_UpMatrix, worldPos.xyz);
float heightFog = saturate((worldSpaceDirection.y - _Azure_HeightFogStart) / (_Azure_HeightFogEnd + _Azure_HeightFogStart));
heightFog = 1.0 - heightFog;
heightFog *= heightFog;
heightFog *= heightFogDistance;
float fogFactor = saturate(fog + heightFog * _Azure_HeightFogDensity);
// Apply Fog.
fogScatteringColor = lerp(fragOutput.rgb, fogScatteringColor, fogFactor * lerp(fragOutput.a, 1.0, 2.0 - fogFactor));
return float4(fogScatteringColor, fragOutput.a);
}