c++ - 在顶点着色器 OpenGL 3.x 中使用计算观察矩阵

标签 c++ opengl matrix glsl glm-math

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

Calculating a LookAt matrix

            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;

我计算那个 CPU 端并将它作为一个统一的方式以与透视矩阵相同的方式传递给着色器。

着色器看起来像这样。

 gl_Position =   lookAtMatrix * position * perspectiveMatrix;

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

    eye(0.0f,0.0f,10.0f);
center(0.0f,0.0f,0.0f);
up(0.0f,0.0f,1.0f);

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

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

最佳答案

gl_Position =   lookAtMatrix * position * perspectiveMatrix;

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

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

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

gl_Position =   perspectiveMatrix * lookAtMatrix * position;

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

关于c++ - 在顶点着色器 OpenGL 3.x 中使用计算观察矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486484/

相关文章:

c++ - 调用堆栈和堆栈有什么区别?

opengl - GPU 如何处理随机访问?

matlab - 相对于 Octave/MATLAB 中的向量值移动矩阵中的行

arrays - 从文本中获取矩阵的函数式方法

C++ 无法返回 sf::Texture

C++ 宏定义包括点?

c++ - 为什么 Q_OBJECT 会破坏 QDoc?

OpenGL/Gtkmm 游戏 - 键盘移动

c++ - GPU 上的图像处理 - 滤镜的连续着色器 - FBO

matlab - 每列最少 2 个连续非零值的最低起始行索引