Siggraph2023:渲染向论文导读
A Realistic Surface-based Cloth Rendering Model
fiber 纤维,股的组成部分 ply 股(织线的组成) yarn 纺线,n-ply yarn,n股纺线 - ply level 由ply不同的数量、缠绕的方式造成的yarn的不同外观 woven cloth 梭织 - warp-weft 经-纬 knitted cloth 针织 - knittet coth 会由于缠绕方式的不同产生体积/阴影遮挡效果,这个层级被称为pattern level
BSDF
输入
- 几何:由于有delta transmission的需要,分为正面和反面的两组geometric texture map,贴图作为一个最小的可重复tile(<256x256),内容包括:
- ply法线贴图 \(\boldsymbol{n_p}(p)\)
- ply切线贴图 \(\boldsymbol{t_p}(p)\)
- 3D位置贴图 \(x(p)\)
- ID贴图(指定yarn的类型,比如对于梭织来说,区别经线和纬线;以及yarn之间的空白空间以产生delta transmission) \(I(p)\)
- ply中fiber的缠绕角度\(\omega\),按这个角度将ply切线贴图按ply法线贴图旋转就能得到fiber的切线方向
- 加入一个噪声\(N(p)\)来模拟前文中提到fiber构成ply的不规律性,文章中采用的是amplitude为5°的柏林噪声
- 着色:两个参数
- albedo
- roughness \(\alpha\):用于描述fiber级别的scattering lobe和per fiber对于主twisting angle \(\omega\)的偏移值
微观BSDF
ply level 表达式: \[ \begin{aligned} f(x, \mathbf{i}, \mathbf{o}) & =I(x)\left(f^{r, s}(x, \mathbf{i}, \mathbf{o})+f^{r, d}(x, \mathbf{i}, \mathbf{o})\right) \\ & +I(x)\left(f^{t, s}(x, \mathbf{i}, \mathbf{o})+f^{t, d}(x, \mathbf{i}, \mathbf{o})\right) \\ & +(1-I(x)) f^{\delta}(x, \mathbf{i}, \mathbf{o}), \end{aligned} \] 前两项分别是常规的reflectance和transmission,每一项由可以进一步细分为SpongeCake lobe(通过fiber的directional scattering/reflectance,依赖于\(x\)点的fiber方向)和diffuse lobe(multiple scattering);后面一项是delta transmission SpongeCake项用SGGX分布建模,由fiber切线和reflectance&transmission roughness作为参数。 \(I(x)\)决定了delta transmission和general reflectance/transmission的比例,越接近0则transmission的部分越多 Delta transmission 之前论文忽略的一项,用于建模布料中没有scatter的光路: \[ f^{\delta}(x, \mathbf{i}, \mathbf{o})=\frac{\delta(\mathbf{i}+\mathbf{o})}{\left\langle\mathbf{i} \cdot \mathbf{n}_{\mathrm{s}}\right\rangle} \] 这里特别解释了为什么除以了一个\(\left\langle\mathbf{i} \cdot \mathbf{n}_{\mathrm{s}}\right\rangle\):因为delta transmission不会产生立体角相关的能量损耗(like other singular BSDFs),用来抵消渲染方程积分项中的\(\cos \theta\)
中尺度BSDF
yarn level! 用于补偿微观BSDF未考虑到的non-local effects。这里使用了叫做 effective BSDF的公式(用于描述一个像素覆盖的微几何的reflectance的总和): \[ \begin{array}{r}f^{\text {eff }}(\mathbf{i}, \mathbf{o})=\frac{1}{A_{\mathcal{G}}(\mathbf{o})} \int_{\mathcal{P}} f(x(p), \mathbf{i}, \mathbf{o})\left\langle\mathbf{n}_{\mathbf{p}}(p) \cdot \mathbf{i}\right\rangle \\ V(x(p), \mathbf{i}) A_{p}(p, \mathbf{o}) k_{\mathcal{P}}(p) \mathrm{d} p, \end{array} \] 其中\(\mathcal{P}\)被称为flat geometric surface patch,也就是像素中的几何表面单位集合,对应的是kernel\(k_{\mathcal{P}}\)作为归一化项(集合上的积分为1);微几何由前面的贴图参数决定: \[ \mathcal{G}(\mathcal{P})=\left\{\mathbf{n}_{\mathbf{p}}(p), \mathbf{t}_{\mathbf{p}}(p), x(p) \mid p \in \mathcal{P}\right\} \] \(V(x,d)\)是方向\(d\)的二元可见性,\(A_{\mathcal{p}}(p,o)\)是\(o\)方向可见投影区域的面积(论文里好像说错了成了AG): \[ A_{p}(p, \mathbf{o})=\frac{\left\langle\mathbf{o}, \mathbf{n}_{\mathbf{p}}(p)\right\rangle}{\left\langle\mathbf{n}_{\mathbf{s}}, \mathbf{n}_{\mathbf{p}}(p)\right\rangle} V(x(p), \mathbf{o}) \] 最后\(A_{\mathcal{G}}(o)\)是沿\(o\)方向的总投影面积: \[ A_G\left(\mathbf{o}\right)=\int_{\mathcal{P}}\frac{\left\langle\mathbf{o},\mathbf{n_p}(p)\right\rangle}{\left\langle\mathbf{n_s},\mathbf{n_p}(p)\right\rangle}V\left(x(p),\mathbf{o}\right)k\rho\left(p\right)\mathrm{d}p=\frac{\left\langle\mathbf{o},\mathbf{n_f}(\mathcal{P})\right\rangle}{\left\langle\mathbf{n_s},\mathbf{n_f}(\mathcal{P})\right\rangle}, \] 其中\(n_f(\mathcal P)\)是像素中的平均可见微观法线
高效实现
- 出于存储空间、预计算时间和高精度纹理的支持,不对\(f^{\text {eff }}\)做预计算,on flight地estimate: \[
\langle f^{\mathrm{eff}}(\mathbf{i},\mathbf{o})\rangle=\frac{1}{N_{f}A_\mathcal{G}(\mathbf{o})}\sum_{i=1}^{N_{f}}\frac{f_{p}(p_{i},\mathbf{i},\mathbf{o})}{\mathrm{pdf}(p_{i})},
\] 这里直接是在\(\mathcal P\)中进行uniform的采样,每次在宏观表面产生一次intersection就基于微分光线对BSDF进行计算。实际实现的时候利用了
PixelSampler
然后\(N_f\)设为1(好暴力),肯定会让方差变大,但是综合速度的考虑,以及主导的方差应该是illumination产生的,所以认为这个方案暂且可行(你说是那就是吧 however,由于\(A_\mathcal G\)中的\(n_f(\mathcal P)\)本身就是一个积分的结果,如果还这么玩可能会出事,所以服软选择预计算这个项。具体的方案是对position map进行降采样来最小化不同mipmap level的中尺度平均表面坡度(?),然后将他们存储为法线贴图,在渲染时进行采样。这么做的后果就是让estimator变成有偏的,因为没有考虑对于base pattern map进行的扰动(前面提到的噪声\(N(p)\))。 - 前文提到过的二元可见性项\(V(x,d)\)是用来衡量shadowing和masking的,在中尺度几何上考虑局部的可见性,可以用在texture space上的水平搜索(ray marching?)来实现,但是计算量大,同时维度较高,预计算也不太可能。 解决办法是用各向异性球面高斯基(ASG)来近似每个texel的可见性: \[ \begin{aligned}V(p,\mathbf{d})&\approx\mathrm{ASG}(\mathbf{d}|\boldsymbol{\mu}(p),\gamma(p),\sigma_X(\boldsymbol{p}),\sigma_y(\boldsymbol{p}),C(\boldsymbol{p}))&(7)\\&=C\langle\boldsymbol{\mu}(p)\cdot\mathbf{d}\rangle\exp(-\sigma_X(\boldsymbol{p})(\mathbf{d}\cdot\mathbf{x}(\mathbf{p}))^2-\sigma_X(\boldsymbol{p})(\mathbf{d}\cdot\mathbf{y}(\mathbf{p}))^2)\end{aligned} \] 看起来和球谐函数是一个路子,但是可以存储方向性的数据,因此对于每个texel的visibility可以仅存储5个float来解决。
- 拟合ASG到\(V\) 对\(x\)周围的法线进行径向采样,对于每个\(\phi\)都计算半径为20像素的临近像素对应的水平角度\(\theta(\phi)\in[0,\pi/2]\),然后计算horizen,fit到ASG中。\(\mu(p)\)由将其集中在弯曲法线以下得出(?)。剩下的几个形状参数因为发现在切线空间中的2D高斯基能提供类似的拟合,就计算这些二维高斯基的协方差矩阵,即使用协方差的在线加权,权重系数和样本对应的立体角有关。
Deep Real-time Volumetric Rendering Using Multi-feature Fusion
To be continued...
Siggraph2023:渲染向论文导读