Files
UnrealEngine/Engine/Plugins/FX/Niagara/Source/NiagaraShader/Internal/Stateless/NiagaraStatelessSimulationShader.h
2025-05-18 13:04:45 +08:00

61 lines
2.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/Map.h"
#include "GlobalShader.h"
#include "RenderGraphFwd.h"
#include "ShaderParameterStruct.h"
namespace NiagaraStateless
{
static constexpr uint32 MaxGpuSpawnInfos = 8;
BEGIN_SHADER_PARAMETER_STRUCT(FSpawnInfoShaderParameters, NIAGARASHADER_API)
SHADER_PARAMETER_SCALAR_ARRAY(uint32, SpawnInfo_NumActive, [MaxGpuSpawnInfos])
SHADER_PARAMETER_SCALAR_ARRAY(uint32, SpawnInfo_ParticleOffset, [MaxGpuSpawnInfos])
SHADER_PARAMETER_SCALAR_ARRAY(uint32, SpawnInfo_UniqueOffset, [MaxGpuSpawnInfos])
SHADER_PARAMETER_SCALAR_ARRAY(float, SpawnInfo_Time, [MaxGpuSpawnInfos])
SHADER_PARAMETER_SCALAR_ARRAY(float, SpawnInfo_Rate, [MaxGpuSpawnInfos])
SHADER_PARAMETER_SCALAR_ARRAY(float, SpawnInfo_LifetimeScale, [MaxGpuSpawnInfos])
SHADER_PARAMETER_SCALAR_ARRAY(float, SpawnInfo_LifetimeBias, [MaxGpuSpawnInfos])
END_SHADER_PARAMETER_STRUCT()
BEGIN_SHADER_PARAMETER_STRUCT(FCommonShaderParameters, NIAGARASHADER_API)
SHADER_PARAMETER(uint32, Common_RandomSeed)
SHADER_PARAMETER(float, Common_SimulationTime)
SHADER_PARAMETER(float, Common_SimulationDeltaTime)
SHADER_PARAMETER(float, Common_SimulationInvDeltaTime)
SHADER_PARAMETER_ARRAY(FQuat4f, Common_ToSimulationRotations, [3])
SHADER_PARAMETER(uint32, Common_OutputBufferStride)
SHADER_PARAMETER(uint32, Common_GPUCountBufferOffset)
SHADER_PARAMETER_UAV(RWBuffer<float>, Common_FloatOutputBuffer)
//SHADER_PARAMETER_UAV(RWBuffer<half>, Common_HalfOutputBuffer)
SHADER_PARAMETER_UAV(RWBuffer<int>, Common_IntOutputBuffer)
SHADER_PARAMETER_UAV(RWBuffer<int>, Common_GPUCountBuffer)
SHADER_PARAMETER_SRV(Buffer<float>, Common_StaticFloatBuffer)
SHADER_PARAMETER_SRV(Buffer<uint32>, Common_ParameterBuffer)
SHADER_PARAMETER_STRUCT_INCLUDE(FSpawnInfoShaderParameters, SpawnParameters)
END_SHADER_PARAMETER_STRUCT()
class FSimulationShader : public FGlobalShader
{
public:
using FParameters = FCommonShaderParameters;
static constexpr uint32 ThreadGroupSize = 64;
FSimulationShader() {}
FSimulationShader(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FGlobalShader(Initializer) { }
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE"), ThreadGroupSize);
OutEnvironment.SetDefine(TEXT("NIAGARA_MAX_GPU_SPAWN_INFOS"), NiagaraStateless::MaxGpuSpawnInfos);
OutEnvironment.SetDefine(TEXT("GPU_SIMULATION"), 1);
}
};
}