微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

齐次坐标和透视正确性?

如何解决齐次坐标和透视正确性?

vulkan 使用的技术(我也假设其他图形库)以透视正确的方式插入顶点属性是否要求顶点着色器必须规范化同构相机空间顶点位置(即:除以 w -坐标使得 w 坐标为 1.0) 在乘以一个典型的投影矩阵形式之前...

 g/s  0    0         0
  0   g    0         n
  0   0    f/(f-n)   -nf/(f-n)
  0   0    1         0

...为了使透视正确性正常工作?

或者,透视校正是否会继续作用于相机空间中的任何同质顶点位置(w 坐标不是 1.0)?

(我没有完全遵循透视正确性数学,所以我不清楚哪个是这种情况。)

更新:

为了澄清术语:

vec4 modelCoordinates = vec4(x_in,y_in,z_in,1);
mat4 modelToWorld = ...;
vec4 worldCoordinates = modelToWorld * modelCoordinates;
mat4 worldToCamera = ...;
vec4 cameraCoordinates = worldToCamera * worldCoordinates;
mat4 cameraToProjection = ...;
vec4 clipCoordinates = cameraToProjection * cameraCoordinates;
output(clipCoordinates);

cameraToProjection一个类似于问题中所示的矩阵

问题是 cameraCoordinates.w 必须是 1.0 吗?

因此 modelToWorldworldToCamera 矩阵的最后一行必须是 0 0 0 1

解决方法

这正好是倒退的。在着色器中进行透视分割是阻止透视正确插值的原因。光栅化器需要 W 组件提供的透视信息来完成它的工作。 W 为 1 时,插值是在窗口空间中完成的,不考虑透视。

为顶点处理阶段的输出提供一个剪辑空间坐标,让系统做它存在的事情。


顶点着色器必须在乘以典型的投影矩阵形式之前归一化相机空间顶点位置(即:除以 w 坐标,使 w 坐标为 1.0)...>

如果您的相机空间顶点位置的 W 不是 1.0,则发生了以下两种情况之一:

  1. 您有意在投影后的世界空间或一些类似的构造中操作。这是一件非常有效的事情,相机空间的数学计算可以完全合理。

  2. 您的代码在某处损坏了。也就是说,您打算让您的世界和相机空间成为一个正常的、欧几里得的、非齐次的空间,但不知何故数学没有解决。显然,这不是一个完全有效的做法。

在这两种情况下,除以 W 都是错误的做法。如果您放置相机的世界空间是后投影(例如 in this example),除以 W 将破坏您的透视校正插值,如上所述。如果你的代码被破坏了,除以 W 只会掩盖实际问题;修复代码比隐藏错误更好,因为它可能会在其他地方出现。

,

要查看相机坐标是否需要采用标准形式,让我们将相机坐标表示为 w 的倍数,因此它们是 (wx,wy,wz,w)

乘以给定的投影矩阵,我们得到剪辑坐标(wxg/s,wyg,fwz/(f-n)-nfw/(f-n)),wz)

根据固定的 Vulkan 公式计算 x-y 帧缓冲区坐标,我们得到 (P_x * xg/sz +O_x,P_y * Hgy/z + O_y)。请注意,这不依赖于 w,因此多边形顶点在帧缓冲区中的位置不需要相机坐标为正常形式。

同样,多边形内片段重心坐标的计算仅取决于帧缓冲区坐标中的 x,y,因此也与 w 无关。

然而,片段属性的透视正确透视插值确实取决于顶点的 W_clip,因为这在 Vulkan 规范中给出的公式中使用。如上所示,W_clipwz,它依赖于 w 并随它缩放,因此我们可以得出结论,相机坐标必须是正常形式(它们的 w 必须是 { {1}})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。