Files
BladeSmith/Plugins/MiceShaders/Shaders/Private/TemperatureConductionCS.usf
2025-12-07 01:09:28 +08:00

136 lines
4.6 KiB
Plaintext

// TemperatureConductionCS.usf - 温度传导计算着色器
#include "/Engine/Public/Platform.ush"
// -----------------------------------------------------------------------------
// 1. 输入输出缓冲区定义
// -----------------------------------------------------------------------------
// 输入:当前温度缓冲(只读)
Buffer<float> InputTemperatureBuffer;
// 输入:表面体素标志缓冲(只读)
Buffer<uint> SurfaceVoxelFlagsBuffer;
// 输出:新温度缓冲(读写)
RWBuffer<float> OutputTemperatureBuffer;
// 输出:塑性系数缓冲(读写)
RWBuffer<float> OutputPlasticityBuffer;
// -----------------------------------------------------------------------------
// 2. 参数缓冲区(必须与C++ FParameters结构体严格匹配)
// -----------------------------------------------------------------------------
cbuffer Parameters
{
int3 VoxelResolution; // 体素网格分辨率
float ThermalConductivity; // 热传导系数
float CoolingRate; // 表面冷却速率
float AmbientTemperature; // 环境温度
float ForgeTemperatureMin; // 锻造温度下限
float ForgeTemperatureMax; // 锻造温度上限
float DeltaTime; // 时间步长
};
// -----------------------------------------------------------------------------
// 3. 工具函数
// -----------------------------------------------------------------------------
// 获取体素索引(3D坐标转1D索引)
int GetVoxelIndex(int3 coord)
{
return coord.x + coord.y * VoxelResolution.x +
coord.z * VoxelResolution.x * VoxelResolution.y;
}
// 检查体素坐标是否有效
bool IsValidCoord(int3 coord)
{
return all(coord >= 0) && all(coord < VoxelResolution);
}
// 根据温度计算塑性系数(Smoothstep函数)
float CalculatePlasticity(float temperature)
{
float normalized = saturate((temperature - ForgeTemperatureMin) /
(ForgeTemperatureMax - ForgeTemperatureMin));
return normalized * normalized * (3.0 - 2.0 * normalized);
}
// -----------------------------------------------------------------------------
// 4. 计算着色器主函数
// -----------------------------------------------------------------------------
#define THREADGROUP_SIZE_X 8
#define THREADGROUP_SIZE_Y 8
#define THREADGROUP_SIZE_Z 8
[numthreads(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y, THREADGROUP_SIZE_Z)]
void MainCompute(
uint3 GroupID : SV_GroupID,
uint3 GroupThreadID : SV_GroupThreadID,
uint3 DispatchThreadID : SV_DispatchThreadID
)
{
int3 voxelCoord = int3(DispatchThreadID);
// 边界检查
if (!IsValidCoord(voxelCoord))
{
return;
}
int index = GetVoxelIndex(voxelCoord);
float currentTemp = InputTemperatureBuffer[index];
// -------------------------------------------------------------------------
// 5. 热传导计算(6邻域)
// -------------------------------------------------------------------------
float neighborTempSum = 0.0;
int neighborCount = 0;
// 6个邻居方向
const int3 neighbors[6] = {
int3(-1, 0, 0), int3(1, 0, 0), // X轴
int3(0, -1, 0), int3(0, 1, 0), // Y轴
int3(0, 0, -1), int3(0, 0, 1) // Z轴
};
// 遍历邻居
for (int i = 0; i < 6; i++)
{
int3 neighborCoord = voxelCoord + neighbors[i];
if (IsValidCoord(neighborCoord))
{
int neighborIndex = GetVoxelIndex(neighborCoord);
neighborTempSum += InputTemperatureBuffer[neighborIndex];
neighborCount++;
}
}
// 平均邻居温度
float avgNeighborTemp = neighborTempSum / max(neighborCount, 1);
// 热传导增量(向平均温度靠拢)
float heatConductionDelta = ThermalConductivity * (avgNeighborTemp - currentTemp) * DeltaTime;
// -------------------------------------------------------------------------
// 6. 表面冷却计算
// -------------------------------------------------------------------------
float coolingDelta = 0.0;
bool isSurface = (SurfaceVoxelFlagsBuffer[index] & 1) != 0;
if (isSurface)
{
// 表面体素向环境温度冷却
coolingDelta = CoolingRate * (AmbientTemperature - currentTemp) * DeltaTime;
}
// -------------------------------------------------------------------------
// 7. 更新温度和塑性系数
// -------------------------------------------------------------------------
float newTemp = currentTemp + heatConductionDelta + coolingDelta;
OutputTemperatureBuffer[index] = newTemp;
// 更新塑性系数
OutputPlasticityBuffer[index] = CalculatePlasticity(newTemp);
}