Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl gl_Position.w在Vulkan中的角色是什么?_Glsl_Vulkan - Fatal编程技术网

Glsl gl_Position.w在Vulkan中的角色是什么?

Glsl gl_Position.w在Vulkan中的角色是什么?,glsl,vulkan,Glsl,Vulkan,从GLSL顶点着色器输出的变量gl_Position必须有4个坐标。在OpenGL中,似乎w坐标是用来缩放向量的,通过将其他坐标除以它。Vulkan中的w的用途是什么?Vulkan中的着色器和投影的行为与OpenGL中的行为完全相同。深度范围(OpenGL中为[-1,1],Vulkan中为[0,1])或坐标系原点(OpenGL中为左下角,Vulkan中为左上角)存在微小差异,但原理完全相同。硬件仍然是一样的,它在OpenGL和Vulkan中以相同的方式执行计算 四分量向量有多种用途: 可以使用不

从GLSL顶点着色器输出的变量
gl_Position
必须有4个坐标。在OpenGL中,似乎
w
坐标是用来缩放向量的,通过将其他坐标除以它。Vulkan中的
w
的用途是什么?

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

四分量向量有多种用途:

  • 可以使用不同的变换(平移、旋转、缩放) 以相同的方式表示,使用4x4矩阵
  • 投影也可以用4x4矩阵表示
  • 多个变换可以组合成一个4x4矩阵
  • 您提到的
    .w
    组件在透视投影期间使用
  • 所有这些我们都可以使用4x4矩阵,因此我们需要4分量向量(因此它们可以乘以4x4矩阵)。同样,我写这篇文章是因为上面的规则适用于OpenGL和Vulkan

    因此,对于
    gl_Position
    变量的
    .w
    组件,它在Vulkan中完全相同。它用于缩放位置向量-在透视计算(投影矩阵乘法)过程中,原始深度由原始
    .w
    组件修改,并存储在
    gl\u position
    变量的
    .z
    组件中。此外,原始深度也存储在
    .w
    组件中。之后(作为一个固定的功能步骤),硬件执行透视分割,并将存储在
    gl_position
    变量中的位置除以其
    .w
    组件


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

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

    tl;dr:您无法用3D矩阵和向量描述沿z轴的平移。您至少还需要一个维度,因此他们只添加了一个虚拟维度
    w
    。但如果不是1,事情就会破裂,所以保持在下午1点


    无论如何,现在我们从矩阵乘法的快速回顾开始:

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

    所以,如果你要翻译一个向量,你会想要这样的东西:

    查看
    x
    y
    现在如何被
    az
    bz
    翻译?但这很尴尬:

  • 当你移动东西时,你必须考虑到
    z
    有多大(如果
    z
    是负数怎么办?你必须朝相反的方向移动。如果你只想移动一英寸的东西,那就太麻烦了…)
  • 不能沿
    z
    轴移动。你将永远无法飞行或进入地下
  • 但是,如果您可以确保
    z=1
    始终处于位置

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

    但你看到一种模式了吗?使用3D矩阵和3D向量,可以在2D中描述所有基本运动。那么,如果我们增加一个第四维度呢

    看起来很眼熟。如果我们始终保持
    w=1

    好了,现在你得到了所有3轴的平移。这就是所谓的齐次坐标

    但是,如果您正在进行一些大而复杂的转换,导致
    w!=1
    ,而且没有办法绕过它?OpenGL(以及我认为基本上任何其他CG系统)将执行所谓的规范化:将结果向量除以
    w
    组件。我不知道为什么('因为缩放是线性变换?),但它有良好的含义(可以在透视变换中使用)。无论如何,转换矩阵实际上如下所示:


    现在,看看每个组件是如何通过
    w
    缩小的,然后再进行翻译?这就是
    w
    控制缩放的原因。

    gl\u位置
    是一个关键点。
    w
    组件在透视投影中起作用

    投影矩阵描述了从场景中视图的三维点到视口中二维点的映射。它从眼睛空间转换到剪辑空间,剪辑空间中的坐标通过除以剪辑坐标的
    w
    分量()转换为标准化设备坐标(NDC)

    在透视投影中,投影矩阵描述了从针孔相机中看到的世界上的三维点到视口中的二维点的映射
    摄影机平截头体(截断棱锥体)中的眼空间坐标映射到立方体(规范化设备坐标)

    透视投影矩阵:

    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
    
    当通过透视投影矩阵变换视图中的空间时,结果为。
    w
    组件随着到观察点的距离而增加。这会导致对象在移动后变小(如果