【发布时间】:2015-09-30 09:48:29
【问题描述】:
我正在使用 Qt 做一些基本的 OpenGL,以便尝试获得一些简单的几何图形来渲染。我在(-1,-1,-1) 和(1,1,1) 之间创建了一个立方体并对其进行了旋转,以便可以识别整体形状,如果使用正交投影矩阵,我可以看到它:
QMatrix4x4 orthographicMatrix(float top, float bottom, float left, float right, float near, float far)
{
return QMatrix4x4((2.0f)/(right-left), 0, 0, -(right+left)/(right-left),
0, (2.0f)/(top-bottom), 0, -(top+bottom)/(top-bottom),
0, 0, -(2.0f)/(far-near), -(far+near)/(far-near),
0, 0, 0, 1);
}
...
QMatrix4x4 Projection = orthographicMatrix(2, -2, 2, -2, 0.01f, 2);
生成正交/投影矩阵的公式取自https://solarianprogrammer.com/2013/05/22/opengl-101-matrices-projection-view-model/
如果我将相机平移到 Z 上的 1,这个矩阵可以让我看到立方体:
但是,如果我使用透视矩阵(再次使用链接页面中的公式):
QMatrix4x4 perspectiveMatrix(float fov, float aspectRatio, float near, float far)
{
float top = near * qTan((M_PI/180.0f) * (fov/2.0f));
float bottom = -top;
float right = top * aspectRatio;
float left = -right;
return QMatrix4x4((2.0f-near)/(right-left), 0, (right+left)/(right-left), 0,
0, (2.0f-near)/(top-bottom), (top+bottom)/(top-bottom), 0,
0, 0, -(far+near)/(far-near), -(2.0f-far-near)/(far-near),
0, 0, -1, 0);
}
...
QMatrix4x4 Projection = perspectiveMatrix(60.0f, (float)width()/(float)height(), 0.01f, 2);
我从相同的相机位置根本看不到任何几何图形:
我已经检查了很多次代码,但无法弄清楚为什么什么也没显示。我认为它一定与透视矩阵有关,但我的代码似乎完全遵循 Solarian Programmer 页面上指定的内容。这里有什么问题?
作为参考,我的着色器是:
// Vertex
#version 330 core
in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main()
{
vec4 v = vec4(vertexPosition_modelspace,1);
gl_Position = MVP * v;
}
// Fragment
#version 330 core
out vec3 color;
float remap(float inp)
{
while (inp>200.0) inp-=200.0;
return inp/200.0;
}
void main()
{
color = vec3(remap(gl_FragCoord.x), remap(gl_FragCoord.y), 0);
}
【问题讨论】:
-
要调试这样的问题,请使用已知正确的数学库(如 glm)创建一个测试项目,并将相同输入参数的结果与您自己的(::透视矩阵)进行比较。那么你至少可以排除这种可能性。