我正在使用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);
}
答案 0 :(得分:2)
通过从引用中实现透视矩阵,您似乎犯了一些错误。
例如,代码中的第一个条目为(2.0f-near)/(right-left)
,而网站上的条目为(2.0f * near)/(right-left)
。类似的错误也存在于矩阵的其他领域。