2026-05-03 20:37:58 +08:00
|
|
|
|
---
|
|
|
|
|
|
title: Particle
|
|
|
|
|
|
date: 2026-05-03 00:00:00
|
2026-05-03 21:38:46 +08:00
|
|
|
|
excerpt: ARC 引擎粒子系统修改——粒子点光源系统、静态网格切换、MeshParticle VertexFactory 修复
|
2026-05-03 20:37:58 +08:00
|
|
|
|
tags:
|
|
|
|
|
|
- ARC
|
|
|
|
|
|
- Particle
|
|
|
|
|
|
rating: ⭐
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# Particle — 粒子系统
|
|
|
|
|
|
|
|
|
|
|
|
返回 [[ARC引擎修改总览]]
|
|
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
ARC 引擎对粒子系统的修改较为集中,主要新增了粒子驱动的点光源接口和静态网格切换功能。
|
|
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
## 粒子点光源系统
|
2026-05-03 20:37:58 +08:00
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
### 概述
|
2026-05-03 20:37:58 +08:00
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
新增 `IREDPointLightInterface` 接口,允许粒子系统动态创建和管理点光源。格斗游戏中的特效(火焰、电击、能量弹等)需要动态光照来增强视觉表现。
|
2026-05-03 20:37:58 +08:00
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
### 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 修复
|
2026-05-03 20:37:58 +08:00
|
|
|
|
|
|
|
|
|
|
修复 4.25 版本的 MeshParticle 放置 Bug:
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
// MeshParticleVertexFactory.ush
|
|
|
|
|
|
#if !PARTICLE_MESH_INSTANCED
|
|
|
|
|
|
Result.InstanceLocalToWorld = Primitive_LocalToWorld;
|
|
|
|
|
|
#else
|
|
|
|
|
|
Result.InstanceLocalToWorld = ParticleTransform;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
非实例化模式下使用 `Primitive_LocalToWorld` 而非 `ParticleTransform`。
|