开发者
资源
[object Object]

[object Object][object Object]undefined
[object Object]
  • 接口功能:实现光栅化计算。根据给定的三维空间中的点和面,获取屏幕中每个像素点的最小深度及其对应的面片索引,并计算该面片的重心坐标透视矫正插值。

  • 计算公式: findicesfindices记录每个像素点最小深度对应的面索引,barycentricbarycentric记录每个顶点相对于findicesfindices中记录的面的重心坐标透视矫正插值。 计算过程中使用的zbuffer记录每个像素点(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. 若启用了深度先验:

      • 使用深度先验图计算深度阈值depth_thres
      • 如果depth < depth_thres,处理矩形内下个像素点,否则执行下述步骤

      f. zbuffer更新:

      • 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)

    按上述步骤对空间中所有的三角形面片进行处理后,对大小为heightwidthheight * width的屏幕上每个像素点vi=(xi,yi)v_i = (x_i, y_i)

    1. 取zbuffer中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/w0.5+0.5)(width1)+0.5ys=(0.5+0.5y/w)(height1)+0.5zs=z/w0.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=(x2x0)(y1y0)(x1x0)(y2y0)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+occlustion_truncationdepth\_thres = d(x, y) * 0.49999 + 0.5 + occlustion\_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)}
[object Object]

每个算子分为,必须先调用“aclnnRasterizerGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnRasterizer”接口执行计算。

[object Object]
[object Object]
[object Object]
  • 参数说明

    [object Object]
  • 返回值

    aclnnStatus:返回状态码,具体参见

    第一段接口完成入参校验,出现以下场景时报错:

    [object Object]
[object Object]
  • 参数说明

    [object Object]
  • 返回值

    aclnnStatus:返回状态码,具体参见

[object Object]
  • 仅支持useDepthPrior为0输入场景,参数dOptional、occlusionTruncation、useDepthPrior在实际计算中不生效。

  • 确定性计算:

    • aclnnRasterizer默认确定性实现。
[object Object]

示例代码如下,仅供参考,具体编译和执行过程请参考

[object Object]