调整目录结构
This commit is contained in:
@@ -21,15 +21,16 @@
|
||||
|
||||
|
||||
// Sets default values
|
||||
AIronBlock::AIronBlock() : StaticMeshComp(nullptr),
|
||||
AIronBlock::AIronBlock() : StaticMeshComp(nullptr), DeformBaseMat(nullptr), DeformCalMat(nullptr),
|
||||
PositionRenderTarget0(nullptr), PositionRenderTarget1(nullptr),
|
||||
DynMaterial(nullptr)
|
||||
DynMaterial(nullptr), DynCalMaterial(nullptr)
|
||||
{
|
||||
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
||||
PrimaryActorTick.bCanEverTick = true;
|
||||
|
||||
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent"));
|
||||
RootComponent = StaticMeshComp;
|
||||
StaticMeshComp->AttachToComponent(RootComponent,FAttachmentTransformRules::SnapToTargetIncludingScale);
|
||||
//RootComponent = StaticMeshComp;
|
||||
}
|
||||
void AIronBlock::PostInitProperties()
|
||||
{
|
||||
@@ -63,12 +64,6 @@ UTextureRenderTarget2D* AIronBlock::CreateDeformRT(const FString& RTName, int32
|
||||
UTextureRenderTarget2D* RenderTarget = NewObject<UTextureRenderTarget2D>(this, FName(*RTName));
|
||||
if (RenderTarget)
|
||||
{
|
||||
// **关键修复 1:** 设置为32位浮点数格式,以匹配 FLinearColor 和 CS 的 PF_A32B32G32R32F
|
||||
//RenderTarget->RenderTargetFormat = RTF_RGBA32f;
|
||||
|
||||
// **关键修复 2:** 明确告诉引擎我们需要为这个纹理创建UAV
|
||||
//RenderTarget->bCanCreateUAV = true;
|
||||
|
||||
RenderTarget->InitCustomFormat(Size, Size, PF_A32B32G32R32F, false);
|
||||
RenderTarget->bNeedsTwoCopies = true; // 告知引擎这个纹理会被用于Ping-Pong,优化内存
|
||||
RenderTarget->SizeX = Size;
|
||||
@@ -80,8 +75,6 @@ UTextureRenderTarget2D* AIronBlock::CreateDeformRT(const FString& RTName, int32
|
||||
RenderTarget->ClearColor = ClearColor;
|
||||
// 立即创建RHI资源
|
||||
RenderTarget->UpdateResource();
|
||||
// 定义你要清除的颜色 (R=0.5, G=0.5, B=0.5)
|
||||
//FLinearColor ClearColor = FLinearColor(0.25f, 0.25f, 0.25f, 1.0f);
|
||||
|
||||
// 调用 Kismet Rendering Library 的清除函数
|
||||
UKismetRenderingLibrary::ClearRenderTarget2D(
|
||||
@@ -89,8 +82,8 @@ UTextureRenderTarget2D* AIronBlock::CreateDeformRT(const FString& RTName, int32
|
||||
RenderTarget,
|
||||
ClearColor
|
||||
);
|
||||
FlushRenderingCommands();
|
||||
RenderTarget->UpdateResourceImmediate(true);
|
||||
//FlushRenderingCommands();
|
||||
//RenderTarget->UpdateResourceImmediate(true);
|
||||
}
|
||||
return RenderTarget;
|
||||
}
|
||||
@@ -98,12 +91,9 @@ UTextureRenderTarget2D* AIronBlock::CreateDeformRT(const FString& RTName, int32
|
||||
|
||||
void AIronBlock::InitializePositionTexture()
|
||||
{
|
||||
// 创建位置纹理
|
||||
const int32 TextureSize = TexSize; // 纹理尺寸
|
||||
|
||||
// --- 关键修复: 创建两个 RenderTarget ---
|
||||
PositionRenderTarget0 = CreateDeformRT(TEXT("PositionRT0"), TextureSize);
|
||||
PositionRenderTarget1 = CreateDeformRT(TEXT("PositionRT1"), TextureSize);
|
||||
PositionRenderTarget0 = CreateDeformRT(TEXT("PositionRT0"), TexSize);
|
||||
PositionRenderTarget1 = CreateDeformRT(TEXT("PositionRT1"), TexSize);
|
||||
|
||||
// 设置变形材质
|
||||
SetupDeformationMaterial(nullptr);
|
||||
@@ -115,23 +105,27 @@ void AIronBlock::SetupDeformationMaterial(UTexture2D* OrigTex)
|
||||
// 创建动态材质实例
|
||||
if (StaticMeshComp)
|
||||
{
|
||||
// 加载基础材质 (请确保你的材质支持读取 PositionTexture)
|
||||
UMaterial* BaseMaterial = LoadObject<UMaterial>(nullptr, TEXT("/Game/Materials/M_Iron")); // 示例路径
|
||||
if (!BaseMaterial)
|
||||
if (!DeformBaseMat)
|
||||
{
|
||||
BaseMaterial = LoadObject<UMaterial>(nullptr, TEXT("/Engine/BasicShapes/BasicShapeMaterial"));
|
||||
DeformBaseMat = LoadObject<UMaterial>(nullptr, TEXT("/Game/Res/Materials/M_Iron"));
|
||||
}
|
||||
UMaterial* CalMaterial = LoadObject<UMaterial>(nullptr, TEXT("/Game/Materials/M_HitCal")); // 示例路径
|
||||
if (!CalMaterial)
|
||||
if (!DeformBaseMat)
|
||||
{
|
||||
CalMaterial = LoadObject<UMaterial>(nullptr, TEXT("/Engine/BasicShapes/BasicShapeMaterial"));
|
||||
DeformBaseMat = LoadObject<UMaterial>(nullptr, TEXT("/Engine/BasicShapes/BasicShapeMaterial"));
|
||||
}
|
||||
if (BaseMaterial && CalMaterial)
|
||||
if (!DeformCalMat)
|
||||
{
|
||||
DynMaterial = UMaterialInstanceDynamic::Create(BaseMaterial, this);
|
||||
DynCalMaterial = UMaterialInstanceDynamic::Create(CalMaterial, this);
|
||||
DeformCalMat = LoadObject<UMaterial>(nullptr, TEXT("/Game/Res/Materials/M_HitCal"));
|
||||
}
|
||||
if (!DeformCalMat)
|
||||
{
|
||||
DeformCalMat = LoadObject<UMaterial>(nullptr, TEXT("/Engine/BasicShapes/BasicShapeMaterial"));
|
||||
}
|
||||
if (DeformBaseMat && DeformCalMat)
|
||||
{
|
||||
DynMaterial = UMaterialInstanceDynamic::Create(DeformBaseMat, this);
|
||||
DynCalMaterial = UMaterialInstanceDynamic::Create(DeformCalMat, this);
|
||||
StaticMeshComp->SetMaterial(0, DynMaterial);
|
||||
//StaticMeshComp->SetMaterial(1, DynCalMaterial);
|
||||
// 设置初始参数
|
||||
if (DynMaterial)
|
||||
{
|
||||
@@ -185,4 +179,4 @@ void AIronBlock::OnHammerHit(const FHitResult& HitResult)
|
||||
void AIronBlock::Tick(float DeltaTime)
|
||||
{
|
||||
Super::Tick(DeltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,30 +17,22 @@ UCLASS()
|
||||
class BLADESMITH_API AIronBlock : public AActor
|
||||
{
|
||||
GENERATED_BODY()
|
||||
UPROPERTY(EditAnywhere)
|
||||
public:
|
||||
UPROPERTY()
|
||||
UStaticMeshComponent* StaticMeshComp;
|
||||
|
||||
/** 用于Ping-Pong缓冲的渲染目标 A */
|
||||
UPROPERTY()
|
||||
UTextureRenderTarget2D* PositionRenderTarget0;
|
||||
|
||||
/** 用于Ping-Pong缓冲的渲染目标 B */
|
||||
UPROPERTY()
|
||||
UTextureRenderTarget2D* PositionRenderTarget1;
|
||||
|
||||
/** 应用于网格的动态材质实例 */
|
||||
UPROPERTY()
|
||||
UMaterialInstanceDynamic* DynMaterial;
|
||||
|
||||
/** 应用于网格的动态材质实例 */
|
||||
UPROPERTY()
|
||||
UMaterialInstanceDynamic* DynCalMaterial;
|
||||
|
||||
/* 变形表现基础材质 */
|
||||
UPROPERTY(EditAnywhere)
|
||||
UMaterial* DeformBaseMat;
|
||||
/* 变形冲击计算材质 */
|
||||
UPROPERTY(EditAnywhere)
|
||||
UMaterial* DeformCalMat;
|
||||
/* 冲击力系数 */
|
||||
UPROPERTY(EditAnywhere)
|
||||
float ImpactForce;
|
||||
|
||||
/* 冲击力范围 */
|
||||
UPROPERTY(EditAnywhere)
|
||||
float ImpactAffectRange;
|
||||
/* 冲击计算RT贴图大小 */
|
||||
UPROPERTY(EditAnywhere)
|
||||
float TexSize;
|
||||
public:
|
||||
@@ -69,7 +61,14 @@ private:
|
||||
* 1: 读 RT1, 写 RT0
|
||||
*/
|
||||
int32 CurrentTextureIndex = 0;
|
||||
|
||||
/** 应用于网格的动态材质实例 */
|
||||
UMaterialInstanceDynamic* DynMaterial;
|
||||
/** 用于Ping-Pong缓冲的渲染目标 A */
|
||||
UTextureRenderTarget2D* PositionRenderTarget0;
|
||||
/** 用于Ping-Pong缓冲的渲染目标 B */
|
||||
UTextureRenderTarget2D* PositionRenderTarget1;
|
||||
/** 应用于网格的动态材质实例 */
|
||||
UMaterialInstanceDynamic* DynCalMaterial;
|
||||
public:
|
||||
// Called every frame
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
|
||||
Reference in New Issue
Block a user