重心坐标的Vulkan计算?面积函数是 2D 还是 3D?

问题描述

在 Vulkan 规范的第 25.8.1 节基本多边形光栅化中,它说:

重心坐标是一组三个数字,a、b 和 c,每个数字都在 [0,1] 范围内,其中 a + b + c = 1. 这些坐标唯一地指定了三角形内或三角形上的任何点 p 边界为

p = a * p_a + b * p_b + c * p_c

其中 p_a 、 p_b 和 p_c 是三角形的顶点。 a、b 和 c 由以下因素确定:

a = A(p,p_b,p_c) / A(p_a,p_c)
b = A(p,p_a,p_c)
c = A(p,p_b) / A(p_a,p_c)

其中 A(l,m,n) 表示具有顶点 l、m 和 n 的三角形的帧缓冲区坐标中的区域

帧缓冲区坐标在技术上具有三个组成部分。这在 24.5 控制视口中指定为:

顶点的帧缓冲区坐标 (x_f,y_f,z_f ) 由 [snip] 给出

A 函数的具体公式是什么?

是不是:

(a) 与25.8.1中计算三角形是背面还是正面的公式相同,即:

a = -0.5 * sum_i(x_f[i] * y_f[i+1] - x_f[i+1] * y_f[i])

也就是说,A 的论坛不使用其参数的 z_f 组件,而纯粹是 (x_f,y_f) 组件的函数吗? (即在framebuffer-space中计算三角形在x-y平面上的二维投影面积)

或 (b),A 是否使用所有三个帧缓冲区组件?即 A 是否返回完整三维帧缓冲区空间中三角形的面积(例如 here 所示)

或 (c) 其他东西?

解决方法

从数学上讲,这实际上并不重要。无论您选择哪种函数,您都会发现在计算重心坐标时,数学的细节会被除掉。

重心坐标是通过取两个面积的比率来计算的。如果用相同的投影将两个共面的三角形从 3D 空间线性投影到 2D 空间,它们的面积比是不变的(假设它们有一个面积后投影)。