修改shader
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
#include "FTemperatureComputeShader.h"
|
||||
#include "GlobalShader.h"
|
||||
#include "ShaderParameterStruct.h"
|
||||
#include "RHIStaticStates.h"
|
||||
#include "Shader.h"
|
||||
#include "RHICommandList.h"
|
||||
#include "RHIResources.h"
|
||||
#include "ShaderParameterUtils.h"
|
||||
|
||||
// 全局参数存储
|
||||
FThreadSafeTemperatureParams GTemperatureParams;
|
||||
|
||||
// 实现温度传导计算着色器
|
||||
// 路径指向MiceShaders插件中的着色器文件
|
||||
IMPLEMENT_GLOBAL_SHADER(FTemperatureComputeShader,
|
||||
"/MiceShaders/Shaders/Private/TemperatureConductionCS.usf",
|
||||
"MainCompute",
|
||||
SF_Compute);
|
||||
|
||||
// 线程安全参数管理实现
|
||||
void FThreadSafeTemperatureParams::AddParams(const FTemperatureCSDispatchParams& NewParams)
|
||||
{
|
||||
FScopeLock Lock(&ParamsCriticalSection);
|
||||
PendingParams.Add(NewParams);
|
||||
}
|
||||
|
||||
bool FThreadSafeTemperatureParams::ConsumeParams(FTemperatureCSDispatchParams& OutParams)
|
||||
{
|
||||
FScopeLock Lock(&ParamsCriticalSection);
|
||||
if (PendingParams.Num() > 0)
|
||||
{
|
||||
OutParams = PendingParams[0];
|
||||
PendingParams.RemoveAt(0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GlobalShader.h"
|
||||
#include "ShaderParameterStruct.h"
|
||||
#include "RenderGraphUtils.h"
|
||||
|
||||
/**
|
||||
* 温度传导计算着色器的调度参数
|
||||
*/
|
||||
struct MICESHADERS_API FTemperatureCSDispatchParams
|
||||
{
|
||||
// 体素网格分辨率
|
||||
FIntVector VoxelResolution;
|
||||
|
||||
// 物理参数
|
||||
float ThermalConductivity; // 热传导系数
|
||||
float CoolingRate; // 表面冷却速率
|
||||
float AmbientTemperature; // 环境温度
|
||||
float ForgeTemperatureMin; // 锻造温度下限
|
||||
float ForgeTemperatureMax; // 锻造温度上限
|
||||
float DeltaTime; // 时间步长
|
||||
|
||||
// GPU缓冲区资源
|
||||
FBufferRHIRef InputTemperatureBuffer; // 输入温度缓冲(SRV)
|
||||
FBufferRHIRef SurfaceVoxelFlagsBuffer; // 表面体素标志缓冲(SRV)
|
||||
FUnorderedAccessViewRHIRef OutputTemperatureUAV; // 输出温度缓冲(UAV)
|
||||
FUnorderedAccessViewRHIRef OutputPlasticityUAV; // 输出塑性系数缓冲(UAV)
|
||||
|
||||
FTemperatureCSDispatchParams()
|
||||
: VoxelResolution(FIntVector::ZeroValue)
|
||||
, ThermalConductivity(0.1f)
|
||||
, CoolingRate(0.05f)
|
||||
, AmbientTemperature(20.0f)
|
||||
, ForgeTemperatureMin(800.0f)
|
||||
, ForgeTemperatureMax(1200.0f)
|
||||
, DeltaTime(0.0f)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 线程安全的温度计算参数队列
|
||||
*/
|
||||
struct MICESHADERS_API FThreadSafeTemperatureParams
|
||||
{
|
||||
FCriticalSection ParamsCriticalSection;
|
||||
TArray<FTemperatureCSDispatchParams> PendingParams;
|
||||
|
||||
void AddParams(const FTemperatureCSDispatchParams& NewParams);
|
||||
bool ConsumeParams(FTemperatureCSDispatchParams& OutParams);
|
||||
};
|
||||
|
||||
// 全局参数存储
|
||||
extern MICESHADERS_API FThreadSafeTemperatureParams GTemperatureParams;
|
||||
|
||||
/**
|
||||
* 温度传导计算着色器类
|
||||
*/
|
||||
class MICESHADERS_API FTemperatureComputeShader : public FGlobalShader
|
||||
{
|
||||
DECLARE_GLOBAL_SHADER(FTemperatureComputeShader);
|
||||
SHADER_USE_PARAMETER_STRUCT(FTemperatureComputeShader, FGlobalShader);
|
||||
|
||||
BEGIN_SHADER_PARAMETER_STRUCT(FParameters, )
|
||||
// 体素网格参数
|
||||
SHADER_PARAMETER(FIntVector, VoxelResolution)
|
||||
|
||||
// 物理参数
|
||||
SHADER_PARAMETER(float, ThermalConductivity)
|
||||
SHADER_PARAMETER(float, CoolingRate)
|
||||
SHADER_PARAMETER(float, AmbientTemperature)
|
||||
SHADER_PARAMETER(float, ForgeTemperatureMin)
|
||||
SHADER_PARAMETER(float, ForgeTemperatureMax)
|
||||
SHADER_PARAMETER(float, DeltaTime)
|
||||
|
||||
// 缓冲区参数(RDG方式)
|
||||
SHADER_PARAMETER_RDG_BUFFER_SRV(Buffer<float>, InputTemperatureBuffer)
|
||||
SHADER_PARAMETER_RDG_BUFFER_SRV(Buffer<uint>, SurfaceVoxelFlagsBuffer)
|
||||
SHADER_PARAMETER_RDG_BUFFER_UAV(RWBuffer<float>, OutputTemperatureBuffer)
|
||||
SHADER_PARAMETER_RDG_BUFFER_UAV(RWBuffer<float>, OutputPlasticityBuffer)
|
||||
END_SHADER_PARAMETER_STRUCT()
|
||||
|
||||
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
|
||||
{
|
||||
return GetMaxSupportedFeatureLevel(Parameters.Platform) >= ERHIFeatureLevel::SM5;
|
||||
}
|
||||
|
||||
static bool ShouldCache(EShaderPlatform Platform)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// 线程组大小(与HLSL中的numthreads保持一致)
|
||||
static FIntVector GetGroupSize()
|
||||
{
|
||||
return FIntVector(8, 8, 8);
|
||||
}
|
||||
|
||||
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
|
||||
{
|
||||
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
|
||||
OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE_X"), 8);
|
||||
OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE_Y"), 8);
|
||||
OutEnvironment.SetDefine(TEXT("THREADGROUP_SIZE_Z"), 8);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user