如何在顶点着色器中使用 LookAt 矩阵

How to use LookAt matrix in vertex shader

假设我有以下顶点着色器代码:

attribute vec4 vPos;
uniform mat4 MVP;
uniform mat4 LookAt;

void main{
     gl_Position = MVP * vPos;
}

如何使用此着色器中的 LookAt 矩阵来定位相机的眼睛?我试过 LookAt * MVP * vPos 但这似乎没有用,因为我的三角形从屏幕上消失了!

一个LookAt矩阵通常称为View矩阵,并与模型到世界的变换矩阵连接形成WorldView矩阵。然后乘以通常是正交或透视的投影矩阵。模型 space 中的顶点位置与生成的矩阵相乘,以便转换为剪辑 space (有点......我在这里跳过了几个你不必做的步骤并执行由 hardware/driver).

对于您的情况,请确保您使用正确的 'handedness' 进行转换。您也可以尝试以相反的顺序将位置与变换矩阵的转置相乘,例如 vPos*T_MVP*T_LookAt.

我建议将 LookAt 移到着色器之外,以防止对每个顶点进行不必要的计算。着色器仍然如此

gl_Position = MVP * vPos;

并且您使用 glm 在应用程序中操作 MVP。例如:

projection = glm::perspective(fov, aspect, 0.1f, 10000.0f);
view = glm::lookAt(eye, center, up);
model = matrix of the model, with all the dynamic transforms.

MVP = projection * view * model;