【C++游戏引擎开发】第19篇:Compute Shader实现Tile划分
一、Tile划分的数学基础
1.1 Tile尺寸的几何分析
1.1.1 屏幕空间离散化原理
设屏幕分辨率为 W × H W \times H W×H,Tile尺寸为 T w × T h T_w \times T_h Tw×Th,则Tile总数为:
N t i l e s = ⌈ W T w ⌉ × ⌈ H T h ⌉ N_{tiles} = \lceil \frac{W}{T_w} \rceil \times \lceil \frac{H}{T_h} \rceil Ntiles=⌈TwW⌉×⌈ThH⌉
当选择 T w = T h = 32 T_w=T_h=32 Tw=Th=32时,在1080p分辨率下将产生:
N t i l e s = ⌈ 1920 32 ⌉ × ⌈ 1080 32 ⌉ = 60 × 34 = 2040 tiles N_{tiles} = \lceil \frac{1920}{32} \rceil \times \lceil \frac{1080}{32} \rceil = 60 \times 34 = 2040 \text{ tiles} Ntiles=⌈321920⌉×⌈321080⌉=60×34=2040 tiles
1.1.2 局部工作组尺寸优化
Compute Shader的local_size配置需满足:
T w × T h = local_size_x × local_size_y × K T_w \times T_h = \text{local\_size\_x} \times \text{local\_size\_y} \times K Tw×Th=local_size_x×local_size_y×K
其中 K K K为执行批次系数,现代GPU建议取16的倍数
1.2 视锥体插值算法
1.2.1 透视投影参数化
定义Tile在NDC空间的边界:
{ x m i n = − 1 + 2 i N c o l s x m a x = − 1 + 2 ( i + 1 ) N c o l s y m i n = − 1 + 2 j N r o w s y m a x = − 1 + 2 ( j + 1 ) N r o w s \begin{cases} x_{min} = -1 + \frac{2i}{N_{cols}} \\ x_{max} = -1 + \frac{2(i+1)}{N_{cols}} \\ y_{min} = -1 + \frac{2j}{N_{rows}} \\ y_{max} = -1 + \frac{2(j+1)}{N_{rows}} \end{cases} ⎩ ⎨ ⎧xmin=−1+Ncols2ixmax=−1+Ncols2(i+1)ymin=−1+Nrows2jymax=−1+N