QMatrix4x4模型视图投影OpenGL无法获取场景渲染

Mat*_*gan 2 c++ opengl qt

给定此顶点着色器:

attribute vec3 vertex;
uniform mat4 mvp;

void main() {
    gl_Position = mvp * vec4(vertex, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

这个片段着色器:

void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

mvp矩阵是标识或模型矩阵是缩放,旋转或转换变换时,哪个能够渲染下面的数据:

GLfloat values[] = {
    -1.0, -1.0, +0.0,
    +1.0, -1.0, +0.0,
    +0.0, +1.0, +0.0,
};
Run Code Online (Sandbox Code Playgroud)

为什么以下使用Qt QMatrix4x4::lookAtQMatrix4x4::perspective导致场景被渲染,好像没有对象?

QMatrix4x4 model;
QMatrix4x4 view;
view.lookAt(
  QVector3D(0.0, 0.0, 10.0), // Eye
  QVector3D(0.0, 0.0, 0.0), // Focal Point
  QVector3D(0.0, 1.0, 0.0)); // Up vector
QMatrix4x4 proj;
// Window size is fixed at 800.0 by 600.0
proj.perspective(45.0, 800.0 / 600.0, 1.0, 100.0);
QMatrix4x4 mvp = (model * view * proj);
Run Code Online (Sandbox Code Playgroud)

我正在寻找的不仅是如何修复代码,而且通过这种方式,我可以尝试将来调试这些东西.


我只是预感到将mvp更改为p*v*m并解决了问题.如果你必须以相反的顺序进行乘法,为什么它是mvp?我知道矩阵乘法不是传递的.也就是说,如果A和B是矩阵,如果A和B不是I,则A*B!= B*A.

Ret*_*adi 5

它被称为MVP,因为......有人这样称呼它.;)

但这有点道理.它基本上按照它们应用的顺序列出转换.首先将Model矩阵应用于顶点,然后将View矩阵应用于该结果,然后将投影矩阵应用于两者的结果.

或者在数学上,对于输入顶点vObj,您可以写:

vWorld = M * vObj
vEye = V * vWorld
vClip = P * vEye
Run Code Online (Sandbox Code Playgroud)

如果你用方程式代替,你会得到:

vClip = P * vEye = P * (V * vWorld) = P * (V * (M * vObj))
Run Code Online (Sandbox Code Playgroud)

矩阵乘法是关联的,因此可以重写为:

P * (V * (M * vObj)) = (P * V * M) * vObj
Run Code Online (Sandbox Code Playgroud)

因此,组合矩阵计算为P * V * M.