对 Vulkan 视图矩阵感到困惑

问题描述 投票:0回答:1

我正在尝试理解视图矩阵。我正在使用顶点着色器来直接操作视图矩阵值。我对视图矩阵似乎所在的坐标系感到困惑。

#version 450

layout(location = 0) out vec4 outColor;

layout (push_constant) uniform PushConstants {
    mat4 proj;
} pc;

const vec2 kGeometry[] = vec2[](
    vec2(-1, -1), vec2(1, -1), vec2(1, 1),
    vec2(1,1), vec2(-1, 1), vec2(-1, -1)
);

const vec4 kColor[] = vec4[](
    vec4(1, 0, 0, 1), vec4(0, 1, 0, 1), vec4(0, 0, 1, 1),
    vec4(1, 0, 1, 1), vec4(1, 1, 0, 1), vec4(0, 1, 1, 1)
);

void main() {
    vec2 p = kGeometry[gl_VertexIndex];
    outColor = kColor[gl_VertexIndex];

    mat4 view = mat4(1);
    view[3].z = -3; // !!! Translate camera on Z. Expected +3, not -3 to see quad.

    gl_Position =  pc.proj * view * vec4(p, 0, 1);
}

我会参考这些图表:

绘制的四边形,视图矩阵位于 (0, 0, -3):

A) 我希望模型顶点和视图矩阵都位于图 #1 (D1) 所示的右手坐标系中。这是一个右手坐标系,+Y 指向下方,并且 +Z 进入屏幕。

B) D2 在屏幕上显示一个四边形,中心位于 (0,0,0)。我希望相机指向-Z;这是通过眼睛显示的。

C) D3 显示了如果我将 -Z 上的视图矩阵平移 3,使其在 (0,0,-3) 处结束,我预计会发生什么。我希望四边形位于相机后面,因此不可见。然而,将相机定位在这个位置确实显示了四边形。

D) D4 显示了视图矩阵实际所在的坐标系。相机看起来看起来像+Z。

E) D5 显示如果我将视图矩阵转换为 (2, 3, -5) 会发生什么。四边形出现在窗口的右下角。相机似乎在俯视+Z。

F) D6 显示如果我

inverse(viewMat)
会发生什么。在这里,我将视图矩阵定位在 (2, 3, 5)。四边形出现在左上角。相机似乎是向下看 -Z 轴,但坐标系似乎是左手的。

我认为模型顶点被转换为 RH 坐标系,如 D1。但是,当我翻译视图矩阵时,结果不是我预期的那样。

我不是100%确定视图矩阵在什么坐标系中,我也不明白为什么它不是RH,就像D1一样。

glsl vulkan
1个回答
0
投票

默认情况下,对于 Vulkan,顶点着色器的输出剪辑空间坐标在 XY 中为 -1 到 1,在 Z 中为 0 到 1。与 OpenGL 相比,Y 原点翻转(左上角,Y 指向下方)。

从对象坐标到剪辑空间的坐标系完全取决于您——它完全取决于应用程序,而不是 API 强制要求的。你只需要确保矩阵和模型彼此一致......

© www.soinside.com 2019 - 2024. All rights reserved.