修改shader

This commit is contained in:
2025-12-07 23:50:00 +08:00
parent 0ee31987b5
commit 3ea9686964
6 changed files with 136 additions and 34 deletions
@@ -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);
}
};