跳过正文

Interview: Metal + Asahi Linux分析Apple Silicon GPU架构

·912 字·2 分钟
目录

Rasterizer
#

对物体做线性变换重心坐标不变. 比如正交投影到 xy 平面, 相当于面积缩放 nzn \cdot z. 内部子三角形缩放相同, 即面积比例不变, 可用二维面积计算重心坐标. 数学证明:

T(x)=Mx+t, P=ibivi, ibi=1T(P)=M(ibivi)+t=ibiMvi+(ibi)t=ibiMvi+ibit=ibi(Mvi+t)=ibiT(vi) \begin{aligned} T(\mathbf{x}) &= \mathbf{M}\mathbf{x} + \mathbf{t}, \ \mathbf{P} = \sum_i b_i \mathbf{v}_i, \ \sum_i b_i = 1\\ T(\mathbf{P}) &= \mathbf{M}\left(\sum_i b_i \mathbf{v}_i\right) + \mathbf{t}\\ &= \sum_i b_i\,\mathbf{M}\mathbf{v}_i + \left(\sum_i b_i\right) \mathbf{t} = \sum_i b_i\,\mathbf{M}\mathbf{v}_i + \sum_i b_i\,\mathbf{t}\\ &= \sum_i b_i \left( \mathbf{M}\mathbf{v}_i + \mathbf{t} \right) = \sum_i b_i\,T(\mathbf{v}_i) \end{aligned}

透视投影含逐点除以ww使得重心坐标不再恒定, 但透视除法之前的步骤为线性变换, 可通过分析透视除法前的系数关系得到透视矫正系数. 裁剪空间变换如下:

V~(P) = M(P,1) = ibiM(Pi,1) = ibiV~i \tilde{\mathbf{V}}(\mathbf{P})\ =\ \mathbf{M}\,(\mathbf{P},1)\ =\ \sum_i b_i\,\mathbf{M}\,(\mathbf{P}_i,1)\ =\ \sum_i b_i\,\tilde{\mathbf{V}}_i

裁剪空间ww可用重心坐标插值, 将NDC坐标按透视除法的pi=(xi,yi)/wi\mathbf{p}_i=(x_i,y_i)/w_i分解:

p=ibi(xi,yi)jbjwj=ibiwi(xi,yi)/wijbjwj=ibiwijbjwjpi=isipi \begin{aligned} \mathbf{p} &=\frac{\sum_i b_i\,(x_i,y_i)}{\sum_j b_j w_j} = \frac{\sum_i b_i w_i\cdot (x_i,y_i)/w_i}{\sum_j b_j w_j}\\ &=\sum_i \frac{b_i w_i}{\sum_j b_j w_j}\,\mathbf{p}_i = \sum_i s_i \mathbf{p}_i \end{aligned}

基于sis_i推导bib_i:

siwi=bijbjwjisiwi=ibijbjwj=1jbjwjbi=si/wijsj/wj \begin{aligned} \frac{s_i}{w_i} &= \frac{b_i}{\sum_j b_j w_j}\\ \sum_i \frac{s_i}{w_i} &= \frac{\sum_i b_i}{\sum_j b_j w_j} = \frac{1}{\sum_j b_j w_j}\\ b_i &= \frac{s_i / w_i}{\sum_j s_j / w_j} \end{aligned}