综述
- 在移动端PBR的挑战
- 我们优化了哪些硬件
- 更快的BRDF
- Linear/Gamma
- 环境光反射
PBR challenges on Mobile
- 表现
- 很多GPU,架构,特点
- 线性/gamma的工作流
- 缺少高质量贴图压缩格式
- Shader编译不如PC
- Scalar 和 vector 管线
- texCUBElod
- FP32 FP16
- 大量shader变体
优化目标
表现
市场份额
优化等级
对于PBR重要的GPU特性
- 数学逻辑(ALU)和纹理获取(TEX)之间的比例
- Scalar 和 vector 结构
- FP16
- PBS 更容易出现失真@低精度
- 检查小数(1e-4 OK, 1e-5 not)
- 有时由于精度溢出需要额外的clamp
- Vector 管线可能需要不同的优化方式
- 高端和低端 GPU 的 ALU/TEX 差异很大
High-end等级的优化
为移动端优化BRDF
GGX vs BlinnPhong
- GGX - 更加简单的操作(ADD,MUL)但只用了一个复杂运算器(RCP)
- 标准化的Phong - x相同复杂的操作(RCP,EXP,LOG)
- SG相似(RCP,EXP)
$$GGX = \frac{roughness^4}{\pi((N·H)^2(roughness^4-1)+1)^2}$$
$$Phong = \frac{1}{\pi·roughness^4}·(N·H)^{(\frac{2}{roughness^4}-2)}$$
Simple vs Complex op
- PowerVR G6x00 asm(Phong example)
- 可以做很多ops/cycle,但只有 1 个Complex操作
- 大部分其他结构的complex 操作 = Latency
Geometric/Visbility term
Fresnel term
- C.Schuler提出的拟合:
$$F = \frac{specColor}{L·H}$$
- 适合电解质(反射系数:0.02~0.15)
- 导体(又称金属)- 平均值OK(反射系数 0.7~1.0)
- 用 + 无穷 替代 1
不使用直接使用Schuler假设 只是 specColor 可以后乘的灵感(更适合Scalar 管线)
V*F together
- 修改后的KSK和Schlick Fresnel依赖于L·H
- 融合在一起后:
$$V·F = \frac{(1-L·H)^5}{(L·H)^2(1-roughness^2)+roughness^2}$$
近似 V*F
- 不是代数简化
- 拟合相似曲线
$$V·F_{approx} = \frac{1}{(L·H)^2·(roughness + 0.5)}·specColor$$
近似结果
近似 V*F
适合电介质,但在金属显得发散
可以通过更多的操作来改进,但在实践中无关紧要
Comparison of Visibility Terms
Final Specular BRDF
$$BRDF_{spec} = \frac{roughness^4}{4\pi((N·H)^2(roughness^4-1)+1)^2(L·H)^2(roughness+0.5)} specColor$$
- 只有一个除法
- 适合Scalar 管线
环境光BRDF
只是改装了更简单的功能
$$BRDF_{env}=(1-max(roughness,N·V))^3 + specColor$$
Mid 等级的优化
逐顶点光照
- 中端硬件:
- 低带宽,GFLOPS are meh
- Diffuse and ambient per-vertex
- Specular per-pixel
- Environment reflection vector per-vertex
- 高光在切线空间 - 节约矩阵变换
Low级别的优化
LUT
- 低端硬件:
- Low ALU/TEX 比例
- 高光强度用LUT
- <N·H,Roughness>
- 记住隐式几何!
- I = BRDF * N*L
- N•H 是余弦 - 高光真的crammed
LUT specular
- 在LUT中存储 1/16强度
- RL 代替在 NH 节约了一组操作
- 展开 LUT /w R*L^4 来获得高光的更多空间
Linear、Gamma
线性光照:
- 更老的GPU上比较难
- 有额外的消耗
Gamma 和 Linear永远看起来不相同,但我们可以尝试做到
- 一致的基础光强度
- 一致的高光尺寸
破解 Gamma 以匹配 Linear
假设 gamma with 2.0
仅修复高光强度:
保持线性方程镜面部分的参数(粗糙度)
在线性空间中评估镜面反射强度
在应用颜色之前将产生的镜面反射强度转换为 sRGB 空间
= sqrt(specIntensity_Linear) * specColor_sRGB
Gamma Hack 的优点
- 无需uncompress colors/textures from sRGB to Linear
- Roughness is Linear already
- 通常存储在alpha 通道
- 潜在long latency OP(INVSQRT)没有在shader结尾
- 耗时可以被其他操作隐藏
Environment reflections
texCUBElod can be really expensive sometimes
- G6xx0 - high-end mobile GPU!
- optional extension on ES2.0
G6xx0: use dynamic branches to pick 2 closest mips and lerp
texCUBElod
- Lerp 2个极端的mips
- 很丑但很快
- 三种lerp方式:
- hardcoded highest mip#
- middle mip
- 2nd order SH