Files
BlueRoseNote/03-UnrealEngine/卡通渲染相关资料/渲染功能/ARC/Particle/Particle.md

4.3 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
Particle 2026-05-03 00:00:00 ARC 引擎粒子系统修改——粒子点光源系统、静态网格切换、MeshParticle VertexFactory 修复
ARC
Particle

Particle — 粒子系统

返回 ARC引擎修改总览

概述

ARC 引擎对粒子系统的修改较为集中,主要新增了粒子驱动的点光源接口和静态网格切换功能。

粒子点光源系统

概述

新增 IREDPointLightInterface 接口,允许粒子系统动态创建和管理点光源。格斗游戏中的特效(火焰、电击、能量弹等)需要动态光照来增强视觉表现。

IREDPointLightInterface

// REDParticlePointLightUtilities.h
class IREDPointLightInterface
{
    // 点光源参数
    FVector Location;           // 位置
    FLinearColor LightColor;    // 光照颜色
    FLinearColor AmbientColor;  // 环境光颜色
    float Amplitude;            // 强度振幅(闪烁)
    float Frequency;            // 闪烁频率
    float Attenuation;          // 衰减
    float Range;                // 范围
    float Cutoff;               // 截止距离
    float DistanceMultiply;     // 距离乘数
};

特性

  • 粒子生命周期绑定——粒子消亡时自动移除对应点光源
  • 支持振幅和频率控制的闪烁效果
  • 衰减和截止距离独立控制

静态网格切换模块

新增 UParticleModuleStaticMeshSwitch

// 根据 SubImage Index 切换粒子使用的静态网格 Section
// 类似 SubUV 的概念但用于 3D 网格的不同部分

用于格斗游戏特效中:同一个粒子发射器根据阶段显示不同形状的网格(如能量球从小到大变形)。

完整代码解析

// REDParticlePointLightUtilities.h — 粒子点光源接口
class IREDPointLightInterface
{
public:
    // 点光源参数
    FVector Location;              // 世界空间位置
    FLinearColor LightColor;       // 光照颜色
    FLinearColor AmbientColor;     // 环境光贡献颜色
    
    // 动态效果参数
    float Amplitude;               // 强度振幅sin波闪烁的幅度
    float Frequency;               // 闪烁频率Hz
    
    // 衰减参数
    float Attenuation;             // 衰减系数(光照随距离衰减的速率)
    float Range;                   // 最大影响范围
    float Cutoff;                  // 截止距离(超过此距离完全无光照)
    float DistanceMultiply;        // 距离乘数(缩放有效范围)
};

// 粒子系统中使用:
// 粒子 Spawn 时创建点光源Tick 时更新位置
// 粒子 Death 时自动移除对应点光源

MeshParticle 修复:

// MeshParticleVertexFactory.ush — 修复 4.25 Bug
// ASW Change
// 非实例化模式下错误地使用了 ParticleTransform
// 应该使用 Primitive_LocalToWorld
#if !PARTICLE_MESH_INSTANCED
    Result.InstanceLocalToWorld = Primitive_LocalToWorld;    // 修复:使用 Primitive 变换
#else
    Result.InstanceLocalToWorld = ParticleTransform;         // 实例化模式:使用粒子变换
#endif

关联文档

代码修改情况

文件路径 行号 修改类型 修改内容
Source/Runtime/Engine/Public/REDParticlePointLightUtilities.h 全文 新增文件 IREDPointLightInterface 接口定义
Source/Runtime/Engine/Private/Particles/REDParticlePointLightUtilities.cpp 全文 新增文件 粒子点光源注册/更新/移除实现
Source/Runtime/Engine/Private/Particles/ParticleModuleStaticMeshSwitch.cpp 全文 新增文件 UParticleModuleStaticMeshSwitch
Shaders/Private/MeshParticleVertexFactory.ush L343~L354 修改 InstanceLocalToWorld 非实例化模式 Bug 修复
Shaders/Private/MeshParticleVertexFactory.ush L728~L736 新增 VertexFactoryUpdateLocalPositionScale

MeshParticle VertexFactory 修复

修复 4.25 版本的 MeshParticle 放置 Bug

// MeshParticleVertexFactory.ush
#if !PARTICLE_MESH_INSTANCED
    Result.InstanceLocalToWorld = Primitive_LocalToWorld;
#else
    Result.InstanceLocalToWorld = ParticleTransform;
#endif

非实例化模式下使用 Primitive_LocalToWorld 而非 ParticleTransform