恶名昭著-次子-粒子系统架构

1.4k 词

注:原视频我只在GDC Vault看到,没有字幕以及翻译,很多地方可能并不准确

整体架构

System emitter结构
system

Emit 更新
PSSL processing shader language
system

双缓冲结构 30帧

工作流
system
Translucent 半透明
Opaque 半透明
Emit->update(基于状态)->Draw(不透明->半透明)->Sort

system

图形化界面控制 实时编辑
system

编译

两阶段编译:
Expression=>PSSL
PSSL=>manchin code
多数PSSL代码在模板.cs文件中
PSSL编译通过#defines 和命令行参数输入到PSSLcompiler

参数

大概有哪些函数(不是真实的)
system

Emitter有父子级别
Emitter分为EMIT_SPACE 跟 UPDATE_SPACE(查看特效跟查看特效过程)用于自动转换
表达式可以显示转换CONVERT_POS(),CONVERT_VEC(),CONVERT_VELOCITY()
有EMIT_EVENTS指定粒子发射计划
BURST(1000);PASUE(2.0 + X);EMIT(100,20);LOOP;
CPU执行确定:
多少cs线程
限制常数+参数+运算
编译为非常简单的P-code

噪声

CURL_NOISE(PREV_VAL(POS),80,800,0.5)
柏林噪声
4-D(xyz + time)
非随机
广泛使用
单个噪声的叠加
system

Ribbon

system
好像也没说怎么实现的,后半段语速有点快,md

Spline

一组控制点,好像也没说怎么实现的,淦。。

特效实现:从joint来的spline
system
system

Meshs

obj格式从美术那里搞
索引,位置,法线,UV,蒙皮权重,纹理,总表面积

人物冲刺时跟随的mesh,特效很帅(视频也很糊截不出来)
system
system

缺点?

不适合艺术家
重复的复杂表达式(通过在函数中包装常见的东西来帮助)
表达式显示太多了内部方式?(很难判断发生了什么)
难以以一个有意义的方式报告错误
依然有一个输入/输出的网格(意思说是很大但貌似是仅仅为了展示细节?)
简单的文本表示(区分合并的时候很友好)
变量命名约定(需要!)
不能真正循环(中间有参杂导致中断之类的?)
难以处理评价不能轻易做大的效果
PSSL可能可以阅读起来更容易

渲染部分

不透明:
以任意顺序绘制到G-buffer的延迟粒子
实例化粒子 GPU计数
球谐照明查找每个粒子
扭曲粒子有扭曲缓冲区(有用的时候调用)
Ripples(涟漪)

透明:
通过S_VERTEX_ID手动实例化
MaterialTable?
纹理mipmap还有统一调用一张(相同纹理的话)

UV Wraping
每粒子SH lighting
加法/插值混合
从环境获取阴影
在环境投射阴影
阴霾(没听)

边缘部分
可选颜色粒子深度接近深度缓冲区的深度
大量很酷的效果
system

画半透明->画不透明粒子->组合
system

粒子光

待补充。。

多线程

待补充。。

排序

双调排序
system

缺点:
算法通常是递归的难以描述当前交换的是哪一个线程
复杂度O(N*log(N)*log(N))
假如有12w8k粒子的话是2的16次方
大量数据移动需要在每个通道之间切换

归并排序(mergesort)更好
system

Debug

system

参考引用:https://www.gdcvault.com/play/1020367/The-inFAMOUS-Second-Son-Particle

留言