使用顶点着色器 OpenGL 3.x 计算观察矩阵

And*_*rew 2 c++ opengl glsl matrix glm-math

我按照这篇文章构建了 GluLookAt 类型矩阵。

计算 LookAt 矩阵

            Method calculateLookAtMatrix(glm::vec3 eye, glm::vec3 center, glm::vec3 up)

    glm::vec3 zaxis = glm::normalize(center - eye);
    glm::vec3 xaxis = glm::normalize(glm::cross(up, zaxis));
    glm::vec3 yaxis = glm::cross(zaxis, xaxis);

    lookAtMatrix[0][0] = xaxis.x;
    lookAtMatrix[0][1] = yaxis.x;
    lookAtMatrix[0][2] = zaxis.x;

    lookAtMatrix[1][0] = xaxis.y;
    lookAtMatrix[1][1] = yaxis.y;
    lookAtMatrix[1][2] = zaxis.y;

    lookAtMatrix[2][0] = xaxis.z;
    lookAtMatrix[2][1] = yaxis.z;
    lookAtMatrix[2][2] = zaxis.z;

    lookAtMatrix[3][0] = glm::dot(xaxis, -eye);
    lookAtMatrix[3][1] = glm::dot(yaxis, -eye);
    lookAtMatrix[3][2] = glm::dot(zaxis, -eye);

    lookAtMatrix[3][3] = 1;
Run Code Online (Sandbox Code Playgroud)

我计算那个 CPU 端并将它作为一个统一的方式传递给着色器,就像透视矩阵一样。

着色器看起来像这样。

 gl_Position =   lookAtMatrix * position * perspectiveMatrix;
Run Code Online (Sandbox Code Playgroud)

如果将 lookAtMatrix 作为单位矩阵传递,则场景将正确呈现,但是使用上面的代码将矩阵设置为 ...

    eye(0.0f,0.0f,10.0f);
center(0.0f,0.0f,0.0f);
up(0.0f,0.0f,1.0f);
Run Code Online (Sandbox Code Playgroud)

结果是一片空白。场景是在 X/Y 上绘制的 10x10 网格,因此我一直期待场景的缩小视图。

(我玩过行和列,但我 99.9% 确定它们很好,因为透视矩阵很好)

Tim*_*Tim 6

gl_Position =   lookAtMatrix * position * perspectiveMatrix;
Run Code Online (Sandbox Code Playgroud)

这是不正确的。您想通过lookAtMatrix 转换您的位置,然后通过perspectiveMatrix 转换其结果。

使用列向量/列主向量和矩阵时,您希望通过将向量放在矩阵的右侧来将矩阵和向量相乘。

所以你的乘法最终应该是这样的:

gl_Position =   perspectiveMatrix * lookAtMatrix * position;
Run Code Online (Sandbox Code Playgroud)

话虽如此,我不确定为什么您首先将位置放在左侧,所以我想知道您是否在管道中的某处进行了矩阵转置。如果此解决方案不起作用,您可能需要显示更多代码。