软件遮挡剔除开发要点


最近在开发软件遮挡剔除(下简称”软遮”), 用以降低移动端上遮挡剔除在GPU上的压力, 特此记录一些要点.

参考材料
1. 【GDC2023干货分享】移动平台上的软光栅遮挡剔除方案
2. games101透视投影矩阵推导

1. Reversed-Z

由于开发所使用的图形API为DX12, 而DX12中的NDC所使用的立方体的各坐标分量范围为$[0, 1]$, 其使用的投影矩阵为$$\begin{bmatrix}
\frac{1}{r\tan(\alpha / 2)} & 0 & 0 & 0 \\
0 & \frac{1}{\tan(\alpha / 2)} & 0 & 0 \\
0 & 0 & \frac{f}{f – n} & 1 \\
0 & 0 & -\frac{nf}{f – n} & 0
\end{bmatrix},$$其中, $x = r$为右平面, $\tan(\alpha / 2) = -\frac{1}{n}$.
$\\$ 将远平面投影设置为0, 可以更方便地设置深度缓冲区. 最终的投影矩阵如下所示. 参数’$c$’可以是任何正实数(确保投影矩阵为一非奇异矩阵). 可以看到矩阵中只有4个非零项, 比原始矩阵少1个非零项, 也就意味着投影速度加快了. 实际上, 如果你使用SIMD(Single Instruction Multiple Data, 即单指令流多数据流) 会快得多.$$M_{proj} = \begin{bmatrix}
a & 0 & 0 & 0 \\
0 & b & 0 & 0 \\
0 & 0 & 0 & 0 \\
0 & 0 & c(>0) & 0
\end{bmatrix}.$$
2. 生成Occluder Mesh

高质量的Occluder Mesh, 具备以下两点要求:
1) 保持几何轮廓;
2) 尽可能低的三角面数.

由于Occluder Mesh并不用于实际的渲染, 在生成过程中并不需要考虑各类Attribute的变换(包括UV, 法线等), 故我们没有选择采用传统的边坍缩算法去生成Occluder Mesh, 而是采用更激进的减面算法(重新网格化) , 在保持几何轮廓的同时将三角面数尽可能降至最低. 算法步骤大致如下所示:
1) 计算输入Mesh的AABB空间结构;
2) 根据输入Mesh的AABB空间结构在输入Mesh上采样种子点;
3) 计算各个种子点的Winding Number(可通过SDF加速计算), 得到输入Mesh的0-等值面(表面);
4) 对上述步骤得到的0-等值面执行基于体素的保持几何轮廓的减面算法.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注