问题描述
在 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 空间,它们的面积比是不变的(假设它们有一个面积后投影)。