注:原视频我只在GDC Vault看到,没有字幕以及翻译,很多地方可能并不准确
整体架构
System emitter结构
Emit 更新
PSSL processing shader language
双缓冲结构 30帧
工作流
Translucent 半透明
Opaque 半透明
Emit->update(基于状态)->Draw(不透明->半透明)->Sort
图形化界面控制 实时编辑
编译
两阶段编译:
Expression=>PSSL
PSSL=>manchin code
多数PSSL代码在模板.cs文件中
PSSL编译通过#defines 和命令行参数输入到PSSLcompiler
参数
大概有哪些函数(不是真实的)
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)
非随机
广泛使用
单个噪声的叠加
Ribbon
好像也没说怎么实现的,后半段语速有点快,md
Spline
一组控制点,好像也没说怎么实现的,淦。。
特效实现:从joint来的spline
Meshs
obj格式从美术那里搞
索引,位置,法线,UV,蒙皮权重,纹理,总表面积
人物冲刺时跟随的mesh,特效很帅(视频也很糊截不出来)
缺点?
不适合艺术家
重复的复杂表达式(通过在函数中包装常见的东西来帮助)
表达式显示太多了内部方式?(很难判断发生了什么)
难以以一个有意义的方式报告错误
依然有一个输入/输出的网格(意思说是很大但貌似是仅仅为了展示细节?)
简单的文本表示(区分合并的时候很友好)
变量命名约定(需要!)
不能真正循环(中间有参杂导致中断之类的?)
难以处理评价不能轻易做大的效果
PSSL可能可以阅读起来更容易
渲染部分
不透明:
以任意顺序绘制到G-buffer的延迟粒子
实例化粒子 GPU计数
球谐照明查找每个粒子
扭曲粒子有扭曲缓冲区(有用的时候调用)
Ripples(涟漪)
透明:
通过S_VERTEX_ID手动实例化
MaterialTable?
纹理mipmap还有统一调用一张(相同纹理的话)
UV Wraping
每粒子SH lighting
加法/插值混合
从环境获取阴影
在环境投射阴影
阴霾(没听)
边缘部分
可选颜色粒子深度接近深度缓冲区的深度
大量很酷的效果
画半透明->画不透明粒子->组合
粒子光
待补充。。
多线程
待补充。。
排序
双调排序
缺点:
算法通常是递归的难以描述当前交换的是哪一个线程
复杂度O(N*log(N)*log(N))
假如有12w8k粒子的话是2的16次方
大量数据移动需要在每个通道之间切换
归并排序(mergesort)更好
Debug
参考引用:https://www.gdcvault.com/play/1020367/The-inFAMOUS-Second-Son-Particle