假设我在下面有以下顶点着色器代码:
attribute vec4 vPos;
uniform mat4 MVP;
uniform mat4 LookAt;
void main{
gl_Position = MVP * vPos;
}
如何在此着色器中使用LookAt
矩阵定位相机的眼睛?我试过了LookAt * MVP * vPos
,但这似乎没有用,因为我的三角形刚刚从屏幕上消失了!
答案 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;