给定此顶点着色器:
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::lookAt并QMatrix4x4::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.
它被称为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.
| 归档时间: |
|
| 查看次数: |
2811 次 |
| 最近记录: |