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

132 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Particle
date: 2026-05-03 00:00:00
excerpt: ARC 引擎粒子系统修改——粒子点光源系统、静态网格切换、MeshParticle VertexFactory 修复
tags:
- ARC
- Particle
rating: ⭐
---
# Particle — 粒子系统
返回 [[ARC引擎修改总览]]
## 概述
ARC 引擎对粒子系统的修改较为集中,主要新增了粒子驱动的点光源接口和静态网格切换功能。
## 粒子点光源系统
### 概述
新增 `IREDPointLightInterface` 接口,允许粒子系统动态创建和管理点光源。格斗游戏中的特效(火焰、电击、能量弹等)需要动态光照来增强视觉表现。
### IREDPointLightInterface
```cpp
// REDParticlePointLightUtilities.h
class IREDPointLightInterface
{
// 点光源参数
FVector Location; // 位置
FLinearColor LightColor; // 光照颜色
FLinearColor AmbientColor; // 环境光颜色
float Amplitude; // 强度振幅(闪烁)
float Frequency; // 闪烁频率
float Attenuation; // 衰减
float Range; // 范围
float Cutoff; // 截止距离
float DistanceMultiply; // 距离乘数
};
```
### 特性
- 粒子生命周期绑定——粒子消亡时自动移除对应点光源
- 支持振幅和频率控制的闪烁效果
- 衰减和截止距离独立控制
### 静态网格切换模块
新增 `UParticleModuleStaticMeshSwitch`
```cpp
// 根据 SubImage Index 切换粒子使用的静态网格 Section
// 类似 SubUV 的概念但用于 3D 网格的不同部分
```
用于格斗游戏特效中:同一个粒子发射器根据阶段显示不同形状的网格(如能量球从小到大变形)。
### 完整代码解析
```cpp
// 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 修复:
```hlsl
// MeshParticleVertexFactory.ush — 修复 4.25 Bug
// ASW Change
// 非实例化模式下错误地使用了 ParticleTransform
// 应该使用 Primitive_LocalToWorld
#if !PARTICLE_MESH_INSTANCED
Result.InstanceLocalToWorld = Primitive_LocalToWorld; // 修复:使用 Primitive 变换
#else
Result.InstanceLocalToWorld = ParticleTransform; // 实例化模式:使用粒子变换
#endif
```
### 关联文档
- [[RED阴影系统]] — 点光源的阴影着色
- [[RED自定义数据通道]] — 点光源模式下 CustomData 的使用
### 代码修改情况
| 文件路径 | 行号 | 修改类型 | 修改内容 |
|---------|------|---------|---------|
| `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
```hlsl
// MeshParticleVertexFactory.ush
#if !PARTICLE_MESH_INSTANCED
Result.InstanceLocalToWorld = Primitive_LocalToWorld;
#else
Result.InstanceLocalToWorld = ParticleTransform;
#endif
```
非实例化模式下使用 `Primitive_LocalToWorld` 而非 `ParticleTransform`