如何在顶点着色器中使用 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;
假设我有以下顶点着色器代码:
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;