From b027ec64875c09df83a0d50bd1646d268381a808 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Wed, 12 Nov 2025 00:17:23 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E9=80=9Ausf=E8=B0=83=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E5=B0=86usf=E8=BE=93=E5=87=BA=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=88=B0=E6=9D=90=E8=B4=A8=E3=80=82=E4=BD=86=E6=98=AF=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8usf=E6=AD=A3=E5=BC=8F=E7=AE=97=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E5=80=BC=E6=97=A0=E6=B3=95=E4=BA=A7=E7=94=9F?= =?UTF-8?q?=E5=BD=A2=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 111.txt | 48 +++++++++ BladeSmith.sln.DotSettings.user | 2 + Content/Materials/M_Iron.uasset | Bin 14196 -> 15059 bytes Plugins/MiceShaders/MiceShaders.uplugin | 24 +++++ Plugins/MiceShaders/Resources/Icon128.png | Bin 0 -> 12699 bytes .../Shaders/Private/DeformationCS.usf | 91 ++++++++++++++++++ .../Source/MiceShaders/MiceShaders.Build.cs | 56 +++++++++++ .../Private}/FDeformComputeShader.cpp | 2 +- .../MiceShaders/Private/MiceShaders.cpp | 24 +++++ .../Public}/FDeformComputeShader.h | 27 +++--- .../Source/MiceShaders/Public/MiceShaders.h | 14 +++ Source/BladeSmith/BladeSmith.Build.cs | 3 +- 12 files changed, 275 insertions(+), 16 deletions(-) create mode 100644 111.txt create mode 100644 Plugins/MiceShaders/MiceShaders.uplugin create mode 100644 Plugins/MiceShaders/Resources/Icon128.png create mode 100644 Plugins/MiceShaders/Shaders/Private/DeformationCS.usf create mode 100644 Plugins/MiceShaders/Source/MiceShaders/MiceShaders.Build.cs rename {Source/BladeSmith => Plugins/MiceShaders/Source/MiceShaders/Private}/FDeformComputeShader.cpp (87%) create mode 100644 Plugins/MiceShaders/Source/MiceShaders/Private/MiceShaders.cpp rename {Source/BladeSmith => Plugins/MiceShaders/Source/MiceShaders/Public}/FDeformComputeShader.h (82%) create mode 100644 Plugins/MiceShaders/Source/MiceShaders/Public/MiceShaders.h diff --git a/111.txt b/111.txt new file mode 100644 index 0000000..ac2b893 --- /dev/null +++ b/111.txt @@ -0,0 +1,48 @@ +// ------------------------------------------------------------------------- + // 4. 坐标计算与边界检查 + // ------------------------------------------------------------------------- + + // DispatchThreadID 从 0 开始,代表在调度区域内的偏移量。 + // 我们将其加上 UpdateRegionParam.xy (Min.X, Min.Y) 得到全局像素坐标。 + int2 PixelCoord = DispatchThreadID.xy + int2(UpdateRegionParam.x, UpdateRegionParam.y); + + // 边界检查:检查是否超出 UpdateRegionParam.zw (Max.X, Max.Y) + if (PixelCoord.x < UpdateRegionParam.x || PixelCoord.x >= UpdateRegionParam.z || + PixelCoord.y < UpdateRegionParam.y || PixelCoord.y >= UpdateRegionParam.w) + { + // 虽然我们调度时已经只调度了需要的区域,但为了安全起见,保留检查。 + // 理论上,如果 C++ 端调度正确,这个检查应该很少触发。 + return; + } + + // ------------------------------------------------------------------------- + // 5. 变形计算逻辑 (与之前相同) + // ------------------------------------------------------------------------- + + // 从输入纹理读取位置 + // Load 需要 int3,第三个分量 (MipLevel) 设为 0 + float4 OriginalPos = InputTexture.Load(int3(PixelCoord, 0)); + + // 计算到碰撞点的距离 + float dist = distance(OriginalPos.xyz, ImpactPoint); + + // 在变形半径内处理 + if (dist < DeformationRadius) + { + // 计算变形衰减 (高斯衰减) + float falloff = exp(-(dist * dist) / (2.0 * DeformationRadius * DeformationRadius)); + + // 计算变形量 (考虑法线方向) + float3 deformation = ImpactNormal * ImpactForce * falloff * 0.01; + + // 应用塑性变形 + float3 newPos = OriginalPos.xyz + deformation * Plasticity; + + // 写入新位置 + OutputTexture[PixelCoord] = float4(newPos, OriginalPos.w); + } + else + { + // 保持原位置 + OutputTexture[PixelCoord] = OriginalPos; + } \ No newline at end of file diff --git a/BladeSmith.sln.DotSettings.user b/BladeSmith.sln.DotSettings.user index 571bc59..afc749d 100644 --- a/BladeSmith.sln.DotSettings.user +++ b/BladeSmith.sln.DotSettings.user @@ -2,6 +2,8 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded \ No newline at end of file diff --git a/Content/Materials/M_Iron.uasset b/Content/Materials/M_Iron.uasset index 1912c4e733009c4da9c3dcaf87c98b642cb061fd..07ff7edfad647cfa469251ef678a554ee4c6b032 100644 GIT binary patch delta 7226 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 diff --git a/Plugins/MiceShaders/MiceShaders.uplugin b/Plugins/MiceShaders/MiceShaders.uplugin new file mode 100644 index 0000000..6b737d8 --- /dev/null +++ b/Plugins/MiceShaders/MiceShaders.uplugin @@ -0,0 +1,24 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "MiceShaders", + "Description": "", + "Category": "Other", + "CreatedBy": "", + "CreatedByURL": "", + "DocsURL": "", + "MarketplaceURL": "", + "SupportURL": "", + "CanContainContent": true, + "IsBetaVersion": false, + "IsExperimentalVersion": false, + "Installed": false, + "Modules": [ + { + "Name": "MiceShaders", + "Type": "Runtime", + "LoadingPhase": "PostConfigInit" + } + ] +} \ No newline at end of file diff --git a/Plugins/MiceShaders/Resources/Icon128.png b/Plugins/MiceShaders/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..1231d4aad4d0d462fb7b178eb5b30aa61a10df0b GIT binary patch literal 12699 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 a;7#~yJh_ha>A&A^fRdb=Y>l)<=>Gxy=2LS3 literal 0 HcmV?d00001 diff --git a/Plugins/MiceShaders/Shaders/Private/DeformationCS.usf b/Plugins/MiceShaders/Shaders/Private/DeformationCS.usf new file mode 100644 index 0000000..87e1e58 --- /dev/null +++ b/Plugins/MiceShaders/Shaders/Private/DeformationCS.usf @@ -0,0 +1,91 @@ +// DeformationCS.usf + +#include "/Engine/Public/Platform.ush" + +// ----------------------------------------------------------------------------- +// 1. 输入输出定义 +// ----------------------------------------------------------------------------- +// 必须与 C++ 的 SHADER_PARAMETER_RDG_TEXTURE_SRV 匹配 +Texture2D InputTexture; +// 必须与 C++ 的 SHADER_PARAMETER_RDG_TEXTURE_UAV 匹配 +RWTexture2D OutputTexture; + +// ----------------------------------------------------------------------------- +// 2. 参数缓冲区 (必须与 C++ FParameters 结构体严格匹配) +// ----------------------------------------------------------------------------- +cbuffer Parameters +{ + float3 ImpactPoint; + float ImpactForce; + float3 ImpactNormal; + float DeformationRadius; + float Plasticity; + int3 TextureSize; + + // 修正后的参数:对应 C++ 的 FIntVector4 UpdateRegionParam + // 分量顺序: (Min.X, Min.Y, Max.X, Max.Y) + int4 UpdateRegionParam; +}; + +// ----------------------------------------------------------------------------- +// 3. 线程组大小和入口点 +// ----------------------------------------------------------------------------- +#define THREADGROUP_SIZE_X 8 +#define THREADGROUP_SIZE_Y 8 +[numthreads(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y, 1)] +void MainCompute( // 注意: 建议使用 MainCompute,如果 C++ 注册的是 MainCompute + uint3 GroupID : SV_GroupID, + uint3 GroupThreadID : SV_GroupThreadID, + uint3 DispatchThreadID : SV_DispatchThreadID // 全局线程 ID +) +{ + // ------------------------------------------------------------------------- + // 4. 坐标计算与边界检查 + // ------------------------------------------------------------------------- + + // DispatchThreadID 从 0 开始,代表在调度区域内的偏移量。 + // 我们将其加上 UpdateRegionParam.xy (Min.X, Min.Y) 得到全局像素坐标。 + int2 PixelCoord = DispatchThreadID.xy + int2(UpdateRegionParam.x, UpdateRegionParam.y); + + // 边界检查:检查是否超出 UpdateRegionParam.zw (Max.X, Max.Y) + if (PixelCoord.x < UpdateRegionParam.x || PixelCoord.x >= UpdateRegionParam.z || + PixelCoord.y < UpdateRegionParam.y || PixelCoord.y >= UpdateRegionParam.w) + { + // 虽然我们调度时已经只调度了需要的区域,但为了安全起见,保留检查。 + // 理论上,如果 C++ 端调度正确,这个检查应该很少触发。 + return; + } + + // ------------------------------------------------------------------------- + // 5. 变形计算逻辑 (与之前相同) + // ------------------------------------------------------------------------- + + // 从输入纹理读取位置 + // Load 需要 int3,第三个分量 (MipLevel) 设为 0 + float4 OriginalPos = InputTexture.Load(int3(PixelCoord, 0)); + + // 计算到碰撞点的距离 + float dist = distance(OriginalPos.xyz, ImpactPoint); + + // 在变形半径内处理 + if (dist < DeformationRadius) + { + // 计算变形衰减 (高斯衰减) + float falloff = exp(-(dist * dist) / (2.0 * DeformationRadius * DeformationRadius)); + + // 计算变形量 (考虑法线方向) + float3 deformation = ImpactNormal * ImpactForce * falloff * 0.01; + + // 应用塑性变形 + float3 newPos = OriginalPos.xyz + deformation * Plasticity; + + // 写入新位置 + OutputTexture[PixelCoord] = float4(newPos, OriginalPos.w); + } + else + { + // 保持原位置 + OutputTexture[PixelCoord] = OriginalPos; + } + +} \ No newline at end of file diff --git a/Plugins/MiceShaders/Source/MiceShaders/MiceShaders.Build.cs b/Plugins/MiceShaders/Source/MiceShaders/MiceShaders.Build.cs new file mode 100644 index 0000000..17dbe27 --- /dev/null +++ b/Plugins/MiceShaders/Source/MiceShaders/MiceShaders.Build.cs @@ -0,0 +1,56 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; + +public class MiceShaders : ModuleRules +{ + public MiceShaders(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicIncludePaths.AddRange( + new string[] { + // ... add public include paths required here ... + "MiceShaders/Public" + } + ); + + + PrivateIncludePaths.AddRange( + new string[] { + // ... add other private include paths required here ... + "MiceShaders/Private" + } + ); + + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + // ... add other public dependencies that you statically link with here ... + "RenderCore", + "RHI", + } + ); + + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "Engine", + "Projects" + // ... add private dependencies that you statically link with here ... + } + ); + + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { + // ... add any modules that your module loads dynamically here ... + } + ); + } +} diff --git a/Source/BladeSmith/FDeformComputeShader.cpp b/Plugins/MiceShaders/Source/MiceShaders/Private/FDeformComputeShader.cpp similarity index 87% rename from Source/BladeSmith/FDeformComputeShader.cpp rename to Plugins/MiceShaders/Source/MiceShaders/Private/FDeformComputeShader.cpp index 2abd903..0052ddc 100644 --- a/Source/BladeSmith/FDeformComputeShader.cpp +++ b/Plugins/MiceShaders/Source/MiceShaders/Private/FDeformComputeShader.cpp @@ -12,7 +12,7 @@ FThreadSafeDeformationParams GDeformationParams; // 实现Compute Shader -IMPLEMENT_GLOBAL_SHADER(FDeformComputeShader, "/Engine/Private/MiceCola/DeformationCS.usf", "MainCompute", SF_Compute); +IMPLEMENT_GLOBAL_SHADER(FDeformComputeShader, "/MiceShaders/Shaders/Private/DeformationCS.usf", "MainCompute", SF_Compute); // 线程安全参数管理 void FThreadSafeDeformationParams::AddParams(const FDeformationCSDispatchParams& NewParams) diff --git a/Plugins/MiceShaders/Source/MiceShaders/Private/MiceShaders.cpp b/Plugins/MiceShaders/Source/MiceShaders/Private/MiceShaders.cpp new file mode 100644 index 0000000..f3f6797 --- /dev/null +++ b/Plugins/MiceShaders/Source/MiceShaders/Private/MiceShaders.cpp @@ -0,0 +1,24 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "MiceShaders.h" + +#include "Interfaces/IPluginManager.h" + +#define LOCTEXT_NAMESPACE "FMiceShadersModule" + +void FMiceShadersModule::StartupModule() +{ + // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module + FString PluginShaderDir = FPaths::Combine(IPluginManager::Get().FindPlugin(TEXT("MiceShaders"))->GetBaseDir(), TEXT("Shaders")); + AddShaderSourceDirectoryMapping(TEXT("/MiceShaders/Shaders"), PluginShaderDir); +} + +void FMiceShadersModule::ShutdownModule() +{ + // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, + // we call this function before unloading the module. +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FMiceShadersModule, MiceShaders) \ No newline at end of file diff --git a/Source/BladeSmith/FDeformComputeShader.h b/Plugins/MiceShaders/Source/MiceShaders/Public/FDeformComputeShader.h similarity index 82% rename from Source/BladeSmith/FDeformComputeShader.h rename to Plugins/MiceShaders/Source/MiceShaders/Public/FDeformComputeShader.h index 40f45a0..468a0c4 100644 --- a/Source/BladeSmith/FDeformComputeShader.h +++ b/Plugins/MiceShaders/Source/MiceShaders/Public/FDeformComputeShader.h @@ -5,7 +5,7 @@ #include "RenderGraphUtils.h" // 必须包含 // Compute Shader参数结构体 -struct FDeformationCSDispatchParams +struct MICESHADERS_API FDeformationCSDispatchParams { // 碰撞参数 FVector ImpactPoint; @@ -47,7 +47,7 @@ extern FThreadSafeDeformationParams GDeformationParams; // DeformationCS.h (续) // Compute Shader类 -class FDeformComputeShader : public FGlobalShader +class MICESHADERS_API FDeformComputeShader : public FGlobalShader { DECLARE_GLOBAL_SHADER(FDeformComputeShader); SHADER_USE_PARAMETER_STRUCT(FDeformComputeShader, FGlobalShader); @@ -59,14 +59,13 @@ class FDeformComputeShader : public FGlobalShader SHADER_PARAMETER(FVector3f, ImpactNormal) SHADER_PARAMETER(float, DeformationRadius) SHADER_PARAMETER(float, Plasticity) - - // 纹理参数 - SHADER_PARAMETER_RDG_TEXTURE_SRV(Texture2D, InputTexture) - SHADER_PARAMETER_RDG_TEXTURE_UAV(RWTexture2D, OutputTexture) - // 更新区域 SHADER_PARAMETER(FIntVector, TextureSize) SHADER_PARAMETER(FIntVector4, UpdateRegionParam) + + // 纹理参数 + SHADER_PARAMETER_RDG_TEXTURE_SRV(Texture2D, InputTexture) + SHADER_PARAMETER_RDG_TEXTURE_UAV(RWTexture2D, OutputTexture) END_SHADER_PARAMETER_STRUCT() static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters) @@ -74,13 +73,13 @@ class FDeformComputeShader : public FGlobalShader return GetMaxSupportedFeatureLevel(Parameters.Platform) >= ERHIFeatureLevel::SM5; } - // 2. ✨ 修复 Precache 错误的关键:实现 ShouldPrecachePermutation - // 我们告诉引擎:在开发模式下,请始终预缓存这个着色器。 - static EShaderPermutationPrecacheRequest ShouldPrecachePermutation(const FGlobalShaderPermutationParameters& Parameters) - { - // 如果你的着色器没有使用任何模板或标志,只需返回 E_DEVELOPMENT 或 E_ALL。 - return EShaderPermutationPrecacheRequest::Precached; - } + // // 2. ✨ 修复 Precache 错误的关键:实现 ShouldPrecachePermutation + // // 我们告诉引擎:在开发模式下,请始终预缓存这个着色器。 + // static EShaderPermutationPrecacheRequest ShouldPrecachePermutation(const FGlobalShaderPermutationParameters& Parameters) + // { + // // 如果你的着色器没有使用任何模板或标志,只需返回 E_DEVELOPMENT 或 E_ALL。 + // return EShaderPermutationPrecacheRequest::Precached; + // } static bool ShouldCache(EShaderPlatform Platform) diff --git a/Plugins/MiceShaders/Source/MiceShaders/Public/MiceShaders.h b/Plugins/MiceShaders/Source/MiceShaders/Public/MiceShaders.h new file mode 100644 index 0000000..8b1f9b6 --- /dev/null +++ b/Plugins/MiceShaders/Source/MiceShaders/Public/MiceShaders.h @@ -0,0 +1,14 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "Modules/ModuleManager.h" + +class FMiceShadersModule : public IModuleInterface +{ +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; diff --git a/Source/BladeSmith/BladeSmith.Build.cs b/Source/BladeSmith/BladeSmith.Build.cs index 841e79f..057f8d9 100644 --- a/Source/BladeSmith/BladeSmith.Build.cs +++ b/Source/BladeSmith/BladeSmith.Build.cs @@ -23,7 +23,8 @@ public class BladeSmith : ModuleRules "PhysicsCore", "AudioExtensions", "AudioMixer", - "AudioPlatformConfiguration" + "AudioPlatformConfiguration", + "MiceShaders" }); }