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:透视矩阵啥也不显示的主要内容,如果未能解决你的问题,请参考以下文章

android:fusion 图表啥也不显示

使用 SnapKit 对 UIView 进行约束但啥也不显示

PyOpenGL 透视投影

Android webview 在“#”字符后啥也不渲染

∑GL-透视投影矩阵的推导

∑GL-透视投影矩阵的推导