假设我有以下顶点着色器代码:
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
.