在此页面中: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkFrontFace.html 他们给出了这个方程:
您如何将该公式应用于具有这些坐标的三角形?:
p0(-0.5,-0.5)
p1(0.5,-0.5)
p2(0.5,0.5)
它会扩展成这样吗?
(-1/2) ( ((p0.x)(p1.y) - (p1.x)(p0.y)) + ((p1.x)(p2.y) - (p2.x)( p1.y)) + ((p2.x)(p0.y) - (p0.x)(p2.y)) )
(-1/2) (((-0.5)(-0.5) - (0.5)(-0.5)) + ((0.5)(0.5) - (0.5)(-0.5)) + ((0.5)(- 0.5) - (-0.5)(0.5)) )
(-1/2) ( (0.5) + (0.5) + (0.0) )
-0.5
符号为负,因此它是朝前的,因为“面积为负的三角形被认为是朝前的。”?
如果是这样,这与法线计算有何对应?
三角形好像是这样的:
缠绕似乎是顺时针方向,因此使用默认值(逆时针)它将是背面的。
该公式不是 Vulkan 发明的。这是三角形面积的基本公式。经典形式是这样的:0.5|AB×AC|。 A、B 和 C 是按指定顺序排列的顶点,因此 AB 和 AC 是线段向量:
出于我们的目的,我们不需要精确的面积,我们只需要法线的方向。我们通过计算叉积得到一个法线:AB×AC。这就产生了向量
(0, 0, AB.x⋅AC.y - AB.y⋅AC.x).
只有一个分量的矢量的大小是其绝对值。我们跳过绝对值运算,得到一个带符号的“区域”。所以我们只有:
AB.x⋅AC.y - AB.y⋅AC.x
AB 就是 B-A,类似地 AC = C-A,因此替换它并处理乘法,得到:
Ax⋅By-Bx⋅Ay + Bx⋅Cy-C.x⋅B.y + C.x⋅A.y-A.x⋅c.y
这与规范中的 Σ 相符。
用你的数字,即 (-0.5⋅-0.5)-(0.5⋅-0.5) + (0.5⋅0.5)-(0.5⋅-0.5) + (0.5⋅-0.5)-(-0.5⋅0.5) = 1.
1/2 乘法显然对我们来说并不重要,因为它不改变符号。但无论如何,这使得它 ½×1 = 0.5.
y坐标朝下会导致镜像,因此改变了感知的缠绕方向:
因此我们必须交换方程中的符号:-0.5(AB.x⋅AC.y - AB.y⋅AC.x)。所以我们得到-0.5。
在
VK_FRONT_FACE_COUNTER_CLOCKWISE
的情况下,正面是具有正面积的面,所以我们确实看到了背面。