代码之家  ›  专栏  ›  技术社区  ›  lvella

在Vulkan中gl_position.w的作用是什么?

  •  2
  • lvella  · 技术社区  · 6 年前

    变量 gl_Position glsl顶点着色器的输出必须有4个坐标。在opengl中,似乎 w 坐标用于通过将其他坐标除以矢量来缩放矢量。目的是什么 西 在瓦肯?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Ekzuzy    6 年前

    vulkan中的着色器和投影的行为与opengl中的完全相同。深度范围(opengl中的[1,1],[0,1]在vulkan中)或坐标系原点(opengl中的左下角,vulkan中的左上角)存在微小差异,但原理完全相同。硬件仍然是一样的,它在opengl和vulkan中以同样的方式执行计算。

    四分量矢量有多种用途:

    1. 不同的变换(平移、旋转、缩放)可以是 用同样的方法表示,用4x4矩阵表示。
    2. 投影也可以用4x4矩阵表示。
    3. 多重变换可以合并成一个4x4矩阵。
    4. 这个 .w 您提到的组件在透视投影期间使用。

    所有这些我们都可以用4x4矩阵来实现,因此我们需要4个分量向量(因此它们可以乘以4x4矩阵)。同样,我写这篇文章是因为上面的规则同时适用于opengl和vulkan。

    所以为了 .W条 组成部分 gl_Position 可变的-在Vulkan是完全一样的。它用于缩放位置矢量-在透视计算(投影矩阵乘法)过程中,原始深度由原始深度修改 .W条 组件并存储在 .z 组成部分 总帐位置 变量。此外,原始深度也存储在 .W条 组件。之后(作为一个固定的功能步骤),硬件执行透视分割并分割存储在 总帐位置 变量 .W条 组件。

    在正交投影中,硬件执行的步骤完全相同,但用于计算的值不同。因此透视分割步骤仍然由硬件执行,但它什么也不做(位置被1.0分割)。

        2
  •  2
  •   Rabbid76    6 年前

    gl_Position 是一个 Homogeneous coordinates 是的。这个 w 组件在透视投影中起作用。

    投影矩阵描述从场景中的三维视图点到视口中的二维点的映射。它从眼睛空间转换到剪辑空间,剪辑空间中的坐标通过与 西 剪辑坐标的分量( Perspective divide )中。

    在透视投影中,投影矩阵描述了从针孔相机看到的世界上的3d点到视区的2d点的映射。
    摄像机截锥(一个被截断的金字塔)中的眼空间坐标被映射到一个立方体(标准化的设备坐标)。

    Perspective Projection

    透视投影矩阵:

    r = right, l = left, b = bottom, t = top, n = near, f = far
    
    2*n/(r-l)      0              0                0
    0              2*n/(t-b)      0                0
    (r+l)/(r-l)    (t+b)/(t-b)    -(f+n)/(f-n)    -1    
    0              0              -2*f*n/(f-n)     0
    

    Cartesian coordinate 通过透视投影矩阵对视空间进行变换,得到的结果是 齐次坐标 .这个 西 组件随着到视点的距离而增长。这导致在 透视分水岭 ,如果他们离得更远。

        3
  •  0
  •   Alex    6 年前

    在计算机图形学中,变换用矩阵表示。如果要旋转某个对象,则将其所有顶点(向量)乘以旋转矩阵。想让它移动吗?乘以平移矩阵等。

    TL;博士: 你不能用3D矩阵和向量来描述Z轴上的平移。你至少还需要1个维度,所以他们只是添加了一个虚拟维度 w 是的。但如果不是1,事情就坏了,所以保持在1:p。


    无论如何,现在我们先来快速回顾一下矩阵乘法:

    Matrix multiplication

    你基本上 x 在上面 a ,请 y 在上面 b ,请 z 在上面 c .将整列乘以刚才移动的变量,并将行中的所有内容相加。

    所以如果你要翻译一个向量,你需要像:

    enter image description here

    看看怎么做 X 是的 现在由翻译 az bz 是吗?不过,这很尴尬:

    1. 你得说明有多大 Z轴 当你移动东西时 Z轴 是阴性的?你得朝相反的方向走。如果你只想把东西移过去一英寸,那就太麻烦了……)
    2. 你不能沿着 Z轴 轴。你永远不能飞也不能去地下

    但是,如果你能确定 z = 1 所有时间 以下内容:

    enter image description here

    现在更清楚的是这个矩阵允许你在x-y平面上移动 ,和 数量。唯一的问题是你一直在概念上漂浮,你仍然不能上下。只能在二维空间中移动。

    但你看到这里的图案了吗?有了三维矩阵和三维向量,你就可以在二维中描述所有的基本运动。那么如果我们增加一个第四维呢?

    enter image description here

    看起来很熟悉。如果我们继续 w = 1 任何时候 以下内容:

    enter image description here

    我们走了,现在你得到所有3轴的翻译。这就是所谓的齐次坐标。

    但是,如果您正在进行一些大型复杂的转换,导致 w != 1 ,那就没办法了?opengl(基本上是我认为的任何其他cg系统)将执行所谓的规范化:将结果向量除以 西 组件。我不知道为什么(因为缩放是线性变换?),但它具有良好的含义(可用于透视转换)。无论如何,翻译矩阵实际上看起来像:

    enter image description here

    接下来,看看每个组件是如何收缩的 西 我是说, 然后 它被翻译了?这就是为什么 西 控制缩放。