42 lines
1.6 KiB
HLSL
Raw Normal View History

2025-09-06 17:17:39 +04:00
#ifndef VOLUMETRIC_FOG_2_SURFACE
#define VOLUMETRIC_FOG_2_SURFACE
#if VF2_SURFACE
float4x4 _SurfaceCaptureMatrix;
TEXTURE2D_FLOAT(_SurfaceDepthTexture);
SAMPLER(sampler_SurfaceDepthTexture);
float4 _SurfaceData;
#define SURFACE_CAM_ALTITUDE _SurfaceData.x
#define TERRAIN_FOG_HEIGHT _SurfaceData.y
#define TERRAIN_FOG_MIN_ALTITUDE _SurfaceData.z
#define TERRAIN_FOG_MAX_ALTITUDE _SurfaceData.w
float4 surfaceTexCoordsStart, surfaceTexCoordsEnd;
void SurfaceComputeEndPoints(float3 wposStart, float3 wposEnd) {
surfaceTexCoordsStart = mul(_SurfaceCaptureMatrix, float4(wposStart, 1.0));
surfaceTexCoordsStart.xy /= surfaceTexCoordsStart.w;
surfaceTexCoordsEnd = mul(_SurfaceCaptureMatrix, float4(wposEnd, 1.0));
surfaceTexCoordsEnd.xy /= surfaceTexCoordsEnd.w;
}
void SurfaceApply(inout float3 boundsCenter, inout float3 boundsExtents) {
float2 surfaceTexCoords = lerp(surfaceTexCoordsStart.xy, surfaceTexCoordsEnd.xy, loop_t);
float surfaceDepth = SAMPLE_TEXTURE2D_LOD(_SurfaceDepthTexture, sampler_SurfaceDepthTexture, surfaceTexCoords, 0).r;
#if UNITY_REVERSED_Z
surfaceDepth = 1.0 - surfaceDepth;
#endif
boundsExtents.y = TERRAIN_FOG_HEIGHT;
boundsCenter.y = clamp(SURFACE_CAM_ALTITUDE - surfaceDepth * 10000, TERRAIN_FOG_MIN_ALTITUDE, TERRAIN_FOG_MAX_ALTITUDE);
}
#else
#define SurfaceComputeEndPoints(wposStart, wposEnd)
#define SurfaceApply(boundsCenter, boundsExtents)
#endif // VF2_SURFACE
#endif // VOLUMETRIC_FOG_2_SURFACE