Files
UnrealEngine/Engine/Plugins/Experimental/Water/Shaders/Private/WaterInfoFinalize.usf
2025-05-18 13:04:45 +08:00

78 lines
1.8 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "/Engine/Private/Common.ush"
#include "/Engine/Private/DeferredShadingCommon.ush"
Texture2D<float4> WaterInfoTexture;
float WaterZMin;
float WaterZMax;
float GroundZMin;
float CaptureZ;
int BlurRadius;
struct FWaterInfo
{
float2 Velocity;
float NormalizedWaterZ;
float NormalizedGroundZ;
};
FWaterInfo MakeWaterInfo(float4 InSampleData)
{
FWaterInfo Result;
Result.Velocity = InSampleData.rg;
Result.NormalizedWaterZ = InSampleData.b;
Result.NormalizedGroundZ = InSampleData.a;
return Result;
}
float2 VelocityBlur(float Radius, uint2 TextureCoordinates)
{
float2 Accum = 0;
float Neighbors = 0;
int2 CurrentTextureCoordinates = int2(TextureCoordinates);
for (int X = -Radius; X <= Radius; X++)
{
for(int Y=-Radius; Y <= Radius; Y++)
{
CurrentTextureCoordinates = TextureCoordinates + int2(X, Y);
const FWaterInfo WaterInfo = MakeWaterInfo(WaterInfoTexture.Load(int3(CurrentTextureCoordinates, 0)));
const float WaterZ = WaterInfo.NormalizedWaterZ * (WaterZMax - WaterZMin) + WaterZMin;
const float GroundZ = WaterInfo.NormalizedGroundZ * (WaterZMax - GroundZMin) + GroundZMin;
if (WaterZ > GroundZ)
{
Accum.xy += WaterInfo.Velocity;
Neighbors += 1;
}
}
}
if(Neighbors > 0)
{
Accum.xy /= Neighbors;
}
return float2(Accum);
}
void Main(
in FScreenVertexOutput Input,
out float4 OutColor : SV_Target0)
{
const float4 SVPos = Input.Position;
uint2 TextureCoordinates = floor(SVPos.xy);
const FWaterInfo WaterInfo = MakeWaterInfo(WaterInfoTexture.Load(int3(TextureCoordinates, 0)));
const float2 BlurredVelocity = VelocityBlur(BlurRadius, TextureCoordinates);
OutColor = float4(BlurredVelocity.xy, WaterInfo.NormalizedWaterZ, WaterInfo.NormalizedGroundZ);
}