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

How to use LookAt matrix in vertex shader

本文关键字:LookAt 矩阵 顶点      更新时间:2023-10-16

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

attribute vec4 vPos;
uniform mat4 MVP;
uniform mat4 LookAt;
void main{
     gl_Position = MVP * vPos;
}

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

我建议将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;

LookAt矩阵一般称为View矩阵,与模型到世界的变换矩阵连接形成WorldView矩阵。然后乘以投影矩阵,通常是正射影或透视。模型空间中的顶点位置与结果矩阵相乘,以便转换到剪辑空间(有点…我在这里跳过了一些您不需要执行的步骤,这些步骤由硬件/驱动程序执行。

在你的例子中,确保你在转换中使用了正确的"手性"。你也可以尝试用变换矩阵的转置逆序乘以位置,如vPos*T_MVP*T_LookAt .