Graphics 齐次坐标与透视正确性?

Graphics 齐次坐标与透视正确性?,graphics,3d,vulkan,Graphics,3d,Vulkan,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.

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);
CameratProjection
是一个与问题中所示矩阵类似的矩阵

问题是
cameracordinates.w
必须是
1.0


因此,
modelToWorld
worldToCamera
矩阵的最后一行必须是
01

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

为顶点处理阶段的输出提供剪辑空间坐标,并让系统执行其现有任务


顶点着色器必须在与形式的典型投影矩阵相乘之前规范化同质摄影机空间顶点位置(即:除以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,则发生了以下两种情况之一:

  • 您有意在投影后世界空间或某些类似构造中操作。这是一个非常有效的方法,相机空间的数学模型也非常合理

  • 你的密码在什么地方坏了。也就是说,你希望你的世界和相机空间是一个正常的,欧几里德的,非齐次的空间,但不知怎么的,数学没有解决。显然,这不是一件完全正确的事情


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

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

    为顶点处理阶段的输出提供剪辑空间坐标,并让系统执行其现有任务


    顶点着色器必须在与形式的典型投影矩阵相乘之前规范化同质摄影机空间顶点位置(即:除以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,则发生了以下两种情况之一:

  • 您有意在投影后世界空间或某些类似构造中操作。这是一个非常有效的方法,相机空间的数学模型也非常合理

  • 你的密码在什么地方坏了。也就是说,你希望你的世界和相机空间是一个正常的,欧几里德的,非齐次的空间,但不知怎么的,数学没有解决。显然,这不是一件完全正确的事情


  • 在这两种情况下,除以W是错误的。如果将相机放置到的世界空间是后投影(例如),除以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_clip
    wz
    ,它依赖于
    W
    ,并与之成比例,因此我们可以得出结论,摄像机坐标必须是标准形式(它们的
    w
    必须是
    1.0

    为了确定摄像机坐标是否需要是标准形式,让我们将摄像机坐标表示为
    w
    的倍数,因此它们是
    (wx,wy,wz,w)

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

    计算