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

时间:2015-06-01 13:46:43

标签: c++ opengl-es shader glulookat

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

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

void main{
     gl_Position = MVP * vPos;
}

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

2 个答案:

答案 0 :(得分:1)

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

在您的情况下,请确保您使用的是正确的“手”'为了你的转变。您也可以尝试将相反顺序的位置乘以转换矩阵的转置,如vPos*T_MVP*T_LookAt

答案 1 :(得分:1)

我建议在着色器外移动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;