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

最佳答案

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

4 分量向量有多种用途:

  • 可以进行不同的变换(平移、旋转、缩放)
    以同样的方式表示,用 4x4 矩阵。
  • 投影也可以用 4x4 矩阵表示。
  • 多个变换可以组合成一个 4x4 矩阵。
  • 您提到的 .w 组件用于透视投影。

  • 所有这些我们都可以用 4x4 矩阵来完成,因此我们需要 4 分量向量(所以它们可以乘以 4x4 矩阵)。同样,我写这个是因为上述规则适用于 OpenGL 和 Vulkan。

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

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

    关于glsl - gl_Position.w 在 Vulkan 中的作用是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51318119/

    10-11 06:24