62 lines
2.5 KiB
HLSL
62 lines
2.5 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
/*=============================================================================
|
|
NiagaraDataInterfacePhysicsField.ush
|
|
=============================================================================*/
|
|
|
|
#pragma once
|
|
|
|
/* -----------------------------------------------------------------
|
|
* Rendering code for simulation stages
|
|
* -----------------------------------------------------------------
|
|
*/
|
|
#define MARCH_SINGLE_RAY(RayStart, RayDir, UnitStepSize, LocalStepSize, NumSteps, Volume, RetV) \
|
|
RetV = float4(0,0,0,0); \
|
|
float Transmittance = 1; \
|
|
int Steps = ceil(NumSteps); \
|
|
if(Steps >= 1.0 ) Steps += 1.0; \
|
|
[loop] \
|
|
for (int i = 0; i < Steps && Transmittance > 1e-5; i++) \
|
|
{ \
|
|
float Extinction; \
|
|
float Scattering; \
|
|
float3 Luminance; \
|
|
Volume.ComputeStep(RayStart, RayDir, Extinction, Scattering, Luminance); \
|
|
Luminance *= Scattering; \
|
|
float ClampedExtinction = max(Extinction, 1e-6); \
|
|
float StepTransmittance = exp(-Extinction * LocalStepSize); \
|
|
RetV.rgb += Transmittance * (Luminance - Luminance * StepTransmittance) / ClampedExtinction; \
|
|
Transmittance *= StepTransmittance; \
|
|
if(i == Steps-2) UnitStepSize, LocalStepSize *= frac(NumSteps); \
|
|
RayStart += RayDir * UnitStepSize; \
|
|
} \
|
|
RetV.a = 1. - Transmittance;
|
|
|
|
#define MARCH_SINGLE_RAY_EMISSION(RayStart, RayDir, UnitStepSize, LocalStepSize, NumSteps, Volume, RetV) \
|
|
RetV = float4(0,0,0,0); \
|
|
float Transmittance = 1; \
|
|
int Steps = ceil(NumSteps); \
|
|
if(Steps >= 1.0 ) Steps += 1.0; \
|
|
[loop] \
|
|
for (int i = 0; i < Steps && Transmittance > 1e-5; i++) \
|
|
{ \
|
|
float Extinction; \
|
|
float Scattering; \
|
|
float3 Luminance; \
|
|
float EmissionExtinction = 0; \
|
|
float3 EmissionColor = float3(0,0,0); \
|
|
Volume.ComputeStep(RayStart, RayDir, Extinction, Scattering, Luminance, EmissionExtinction, EmissionColor); \
|
|
float ClampedEmissionExtinction = max(EmissionExtinction, 1e-6); \
|
|
float StepEmissionTransmittance = exp(-EmissionExtinction * LocalStepSize); \
|
|
RetV.rgb += Transmittance * (EmissionColor - EmissionColor * StepEmissionTransmittance) / ClampedEmissionExtinction; \
|
|
Transmittance *= StepEmissionTransmittance; \
|
|
Luminance *= Scattering; \
|
|
float ClampedExtinction = max(Extinction, 1e-6); \
|
|
float StepTransmittance = exp(-Extinction * LocalStepSize); \
|
|
RetV.rgb += Transmittance * (Luminance - Luminance * StepTransmittance) / ClampedExtinction; \
|
|
Transmittance *= StepTransmittance; \
|
|
if(i == Steps-2) UnitStepSize, LocalStepSize *= frac(NumSteps); \
|
|
RayStart += RayDir * UnitStepSize; \
|
|
} \
|
|
RetV.a = 1. - Transmittance;
|