README.md

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

    1. ff的三个顶点坐标v0v_0,v1v_1,v2v_2转换为屏幕坐标vs0v_{s0},vs1v_{s1},vs2v_{s2}

    2. 根据vs0v_{s0},vs1v_{s1},vs2v_{s2}计算包围ff的矩形范围

    3. 对矩形内每个像素点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)

    1. 取Z-Buffer中viv_i对应的面片索引fidxf_{idx}findices(xi,yi)←fidxfindices (x_i, y_i) \gets f_{idx}
    2. ff的三个顶点坐标v0v_0,v1v_1,v2v_2转换为屏幕坐标vs0v_{s0},vs1v_{s1},vs2v_{s2}
    3. 计算viv_i的中心点坐标vcv_c
    4. 计算vcv_c相对于三角形ff的重心坐标(α,β,γ)(\alpha, \beta, \gamma)
    5. 使用(α,β,γ)(\alpha, \beta, \gamma)计算透视矫正插值(α~,β~,γ~)(\tilde{\alpha}, \tilde{\beta}, \tilde{\gamma})
    6. 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)

      1. 分别计算计算三角形(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)的有向面积areaareabeta_tribeta\_trigamma_trigamma\_tri
      2. 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算子。