OpenGL:透视矩阵啥也不显示
Posted
技术标签:
【中文标题】OpenGL:透视矩阵啥也不显示【英文标题】:OpenGL: Perspective matrix shows nothingOpenGL:透视矩阵什么也不显示 【发布时间】: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)创建一个测试项目,并将相同输入参数的结果与您自己的(::透视矩阵)进行比较。那么你至少可以排除这种可能性。 【参考方案1】:您似乎在从参考中实现透视矩阵时犯了一些错误。
例如,您的代码中的第一个条目是(2.0f-near)/(right-left)
,而网站上的第一个条目是(2.0f * near)/(right-left)
。类似的错误也出现在矩阵的其他字段中。
【讨论】:
显然我不习惯使用视网膜屏幕!这就是问题所在,用乘法代替错误的减号似乎有效。谢谢!以上是关于OpenGL:透视矩阵啥也不显示的主要内容,如果未能解决你的问题,请参考以下文章