在特征中设置顶点着色器的投影,模型和视图变换

use*_*342 9 c++ opengl game-engine eigen

我环顾四周,从未见过,确定过,确切地知道每个矩阵的作用以及形成它们的操作(因此实际的特征函数调用).这就是我要找的东西.或至少对过程的描述和具有特征函数的几个例子一般来看一下如何做到这一点!无论如何,这里有一些细节,以防它们有用:

我正在设置一个自上而下的透视游戏(所以相机固定向下,但可以旋转并沿XY平面移动),但是因为我会有一些3D元素(以及一些严格的2D)我认为透视投影效果很好.但我确实想知道形成正交投影需要什么命令......

我理解视图,这可以通过将相机坐标转换到原点,通过相机旋转旋转,将它们转换回原来的位置来完成,然后缩放以进行缩放?但确切地说,涉及哪些功能和对象,我不确定.

并且为了存储任何给定对象的旋转,四元数似乎是最佳选择.那么这将决定模型投影吗?如果我设法将我的旋转简化为一个角度的2D情况,那么四元数会不会浪费?

这些矩阵是否需要从每个帧的身份重新生成?或者他们可以以某种方式改变以适应新数据?

我真的更喜欢使用eigen而不是手持库,但我需要一些工作来弄清楚到底发生了什么...我有所有的GLSL设置和均匀的矩阵被送入渲染在我的VAO中,我只需要了解并制作它们.

编辑:
我的顶点着色器使用这个标准设置,3个统一的mat4s乘以位置vec3:

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);
Run Code Online (Sandbox Code Playgroud)

可以将mat3s和vec2用于位置,以在纯2D情况下获得更好的性能吗?

gga*_*ael 13

下面是一个lookAt和setPerspective函数的示例,它从简单的输入创建视图和投影矩阵:

void Camera::lookAt(const Eigen::Vector3f& position, const Eigen::Vector3f& target, const Eigen::Vector3f& up)
{
  Matrix3f R;
  R.col(2) = (position-target).normalized();
  R.col(0) = up.cross(R.col(2)).normalized();
  R.col(1) = R.col(2).cross(R.col(0));
  mViewMatrix.topLeftCorner<3,3>() = R.transpose();
  mViewMatrix.topRightCorner<3,1>() = -R.transpose() * position;
  mViewMatrix(3,3) = 1.0f;
}

void Camera::setPerspective(float fovY, float aspect, float near, float far)
{
  float theta = fovY*0.5;
  float range = far - near;
  float invtan = 1./tan(theta);

  mProjectionMatrix(0,0) = invtan / aspect;
  mProjectionMatrix(1,1) = invtan;
  mProjectionMatrix(2,2) = -(near + far) / range;
  mProjectionMatrix(3,2) = -1;
  mProjectionMatrix(2,3) = -2 * near * far / range;
  mProjectionMatrix(3,3) = 0;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以指定GL的矩阵:

glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_view"), 1, GL_FALSE, mCamera.viewMatrix().data());
glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_proj"), 1, GL_FALSE, mCamera.projectionMatrix().data());
Run Code Online (Sandbox Code Playgroud)

对于模型转换(最好保持视图和模型分离),可以使用Geometry模块和Scaling,Translation和Quaternion类来组装Affine3f对象.