Rasterizer
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | × |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | × |
功能说明
-
算子功能:实现光栅化计算。根据给定的三维空间中的点和面,获取屏幕中每个像素点的最小深度及其对应的面片索引,并计算该面片的重心坐标透视矫正插值。
-
计算公式: findicesfindices记录每个像素点最小深度对应的面索引,barycentricbarycentric记录每个顶点相对于findicesfindices中记录的面的重心坐标透视矫正插值。 计算过程中使用的Z-Buffer记录每个像素点(x,y)(x, y)的最小深度zmin(x,y)z_{\min}(x, y)以及该深度对应的三角形面片索引face_idx(x,y)\text{face\_idx}(x, y)。
计算过程如下: 对空间中的每个三角形面片ff:
-
将ff的三个顶点坐标v0v_0,v1v_1,v2v_2转换为屏幕坐标vs0v_{s0},vs1v_{s1},vs2v_{s2}
-
根据vs0v_{s0},vs1v_{s1},vs2v_{s2}计算包围ff的矩形范围
-
对矩形内每个像素点vi=(xi,yi)v_i = (x_i, y_i),执行以下操作:
a. 计算像素中心坐标vcv_c
b. 计算vcv_c相对于三角形ff的重心坐标(α,β,γ)(\alpha, \beta, \gamma)
c. 根据(α,β,γ)(\alpha, \beta, \gamma)判断vcv_c是否在三角形内部。若vcv_c不在三角形内部,则处理矩形内下个像素点,否则执行下述步骤
d. 使用(α,β,γ)(\alpha, \beta, \gamma)和vs0v_{s0},vs1v_{s1},vs2v_{s2}得到当前像素的深度值depth
e. 若启用了深度先验;否则,直接执行下一步“Z-Buffer更新”- 使用深度先验图计算深度阈值depth_thres
- 如果depth < depth_thres,处理矩形内下个像素点,否则执行下述步骤
f. Z-Buffer更新:
- 若depth<zmin(xi,yi)depth < z_{\min}(x_i, y_i):
zmin(xi,yi)←depthface_idx(xi,yi)←f\quad z_{\min}(x_i, y_i) \gets \text{depth} \\ \quad \text{face\_idx}(x_i, y_i) \gets f
- 若depth=zmin(xi,yi)depth = z_{\min}(x_i, y_i):
face_idx(xi,yi)←min(face_idx(xi,yi), f)\quad \text{face\_idx}(x_i, y_i) \gets \min(\text{face\_idx}(x_i, y_i),\ f)
按上述步骤对空间中所有的三角形面片进行处理后,对大小为height∗widthheight * width的屏幕上每个像素点vi=(xi,yi)v_i = (x_i, y_i):
- 取Z-Buffer中viv_i对应的面片索引fidxf_{idx},findices(xi,yi)←fidxfindices (x_i, y_i) \gets f_{idx}
- 将ff的三个顶点坐标v0v_0,v1v_1,v2v_2转换为屏幕坐标vs0v_{s0},vs1v_{s1},vs2v_{s2}
- 计算viv_i的中心点坐标vcv_c
- 计算vcv_c相对于三角形ff的重心坐标(α,β,γ)(\alpha, \beta, \gamma)
- 使用(α,β,γ)(\alpha, \beta, \gamma)计算透视矫正插值(α~,β~,γ~)(\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})
- barycentric(xi,yi)←(α~,β~,γ~)barycentric(x_i, y_i) \gets (\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})
以下是涉及的各种具体计算方法:
-
顶点v=(x,y,z,w)v = (x, y, z, w)转换为屏幕坐标vs=(xs,ys,zs)v_s = (x_s, y_s, z_s)
xs=(x/w∗0.5+0.5)∗(width−1)+0.5ys=(0.5+0.5∗y/w)∗(height−1)+0.5zs=z/w∗0.49999+0.5x_s = (x / w * 0.5 + 0.5) * (width - 1) + 0.5\\ y_s = (0.5 + 0.5 * y / w) * (height - 1) + 0.5\\ z_s = z / w * 0.49999 + 0.5
-
点vv相对于三角形(v0,v1,v2)(v_0, v_1, v_2)的重心坐标(α,β,γ)(\alpha, \beta, \gamma)
- 分别计算计算三角形(v0,v1,v2)(v_0, v_1, v_2)、(v0,v,v2)(v_0, v, v_2)和(v0,v1,v)(v_0, v_1, v)的有向面积areaarea、beta_tribeta\_tri和gamma_trigamma\_tri
- 若areaarea为0,则α=β=γ=−1\alpha = \beta = \gamma = -1, 否则
β=beta_tri/areaγ=gamma_tri/areaα=1−β−γ\beta = beta\_tri / area\\ \gamma = gamma\_tri / area\\ \alpha = 1 - \beta - \gamma
-
由顶点v0=(x0,y0,z0)v_0 = (x_0, y_0, z_0),v1=(x1,y1,z1)v_1 = (x_1, y_1, z_1)和v2=(x2,y2,z2)v_2 = (x_2, y_2, z_2)组成的三角形的有向面积
area=(x2−x0)∗(y1−y0)−(x1−x0)∗(y2−y0)area = (x_2 - x_0) * (y_1 - y_0) - (x_1 - x_0) * (y_2 - y_0)
-
结合重心坐标(α,β,γ)(\alpha, \beta, \gamma)和三角形屏幕坐标v0=(x0,y0,z0)v_0 = (x_0, y_0, z_0), v1=(x1,y1,z1)v_1 = (x_1, y_1, z_1)和v2=(x2,y2,z2)v_2 = (x_2, y_2, z_2)计算像素点v=(x,y)v = (x, y)的深度depthdepth
depth=α∗z0+β∗z1+γ∗z2depth = \alpha * z_0 + \beta * z_1 + \gamma * z_2
-
结合深度图dd,遮挡截断occlusion_truncationocclusion\_truncation计算点v=(x,y)v = (x, y)的深度阈值depth_thresdepth\_thres
depth_thres=d(x,y)∗0.49999+0.5+occlusion_truncationdepth\_thres = d(x, y) * 0.49999 + 0.5 + occlusion\_truncation
-
根据重心坐标(α,β,γ)(\alpha, \beta, \gamma)判断顶点是否在三角形内 如果α>=0\alpha >= 0且β>=0\beta >= 0且γ>=0\gamma >= 0则点在三角形内(包括在三角形边上),否则点不在三角形内。
-
结合重心坐标(λ0,λ1,λ2)(\lambda_0, \lambda_1, \lambda_2)以及三角形的三个顶点坐标v0=(x0,y0,z0,w0)v_0 = (x_0, y_0, z_0, w_0),v1=(x1,y1,z1,w1)v_1 = (x_1, y_1, z_1, w_1)和v2=(x2,y2,z2,w2)v_2 = (x_2, y_2, z_2, w_2)计算透视矫正插值(λ0corrected,λ1corrected,λ2corrected)(\lambda_0^{corrected}, \lambda_1^{corrected}, \lambda_2^{corrected})
λicorrected=λi/wi∑(λj/wj)\lambda_i^{corrected} = \frac{\lambda_i / w_i} { \sum (\lambda_j / w_j)}
-
参数说明
-
参数说明:
参数名 输入/输出/属性 描述 数据类型 数据格式 v 输入 表示空间中顶点坐标的输入张量,对应公式描述中的`v`,size为2。 FLOAT32 ND f 输入 表示空间中面片的输入张量,对应公式描述中的`f`,size为2。 INT32 ND d 可选属性 - 表示深度图的输入张量,用于计算深度阈值,此参数不生效。
- 默认值为空。
FLOAT32 ND height 输入 - 表示屏幕高度。
- 默认值为0。
INT64 - width 输入 - 表示屏幕宽度。
- 默认值为0。
INT64 - occlusion_truncation 输入 - 遮挡截断,用于计算深度阈值,此参数不生效。
- 默认值为0.0。
DOUBLE - use_depth_prior 输入 - 表示是否应用深度先验,此参数不生效。
- 默认值为0。
INT64 - findices 输出 表示屏幕中每个像素点最小深度对应的面片索引,对应公式描述中的`findices`,size为2。 INT32 ND barycentric 输出 表示屏幕中每个像素点基于最小深度的面片,求解得到的重心坐标透视矫正插值的输出张量,对应公式描述中的`barycentric`,size为2。 FLOAT32 ND
约束说明
- 仅支持useDepthPrior为0的输入场景,参数d、occlusionTruncation、useDepthPrior在实际计算中不生效。
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| aclnn接口 | test_aclnn_rasterizer | 通过aclnnRasterizer接口方式调用Rasterizer算子。 |