Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL和Qt5.5:glm::perspective不起作用_Qt_Opengl_Glm Math - Fatal编程技术网

OpenGL和Qt5.5:glm::perspective不起作用

OpenGL和Qt5.5:glm::perspective不起作用,qt,opengl,glm-math,Qt,Opengl,Glm Math,我制作了以下透视矩阵,以将问题隔离到glm透视函数: QMatrix4x4 proj (1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.0f, 0.f, 0.f, 1.1f, 1.f); 这会产生一个图像。但是,当尝试使用glm构建透视矩阵时,如下所示: glm::mat4 proj; proj = glm::perspecti

我制作了以下透视矩阵,以将问题隔离到glm透视函数:

QMatrix4x4 proj (1.f, 0.f, 0.f, 0.f,
                 0.f, 1.f, 0.f, 0.f,
                 0.f, 0.f, 1.f, 0.0f,
                 0.f, 0.f, 1.1f, 1.f);
这会产生一个图像。但是,当尝试使用glm构建透视矩阵时,如下所示:

glm::mat4 proj;
proj = glm::perspective(
            glm::radians(80.0f),
            1.0f,
            0.0f,
            2.0f
       );
什么也没发生

我的印象是,当将
0.0f,2.0f
放入近平面和远平面参数时,0.0f-2.0f范围内的任何顶点坐标都被线性插值到坐标系-1.0f到1.0f中,用作标准化设备坐标。但是,无论我在这里输入哪对值,都不会渲染任何内容

以下是我试图绘制的坐标:

rawverts = {
    0.0f, 0.0f, 1.0f,
    0.0f, 0.7f, 1.0f,
    0.4f, 0.0f, 1.0f,
    0.0f, -0.7f, 1.0f,
    -0.4f, 0.0f, 1.0f
};
将投影矩阵传递给顶点着色器时:

int projIndex = shaders->uniformLocation("proj");
...
shaders->setUniformValue(projIndex, QMatrix4x4(glm::value_ptr(proj)) );
顶点着色器本身:

#version 330 core

in vec3 vertex;

uniform mat4 translate;
uniform mat4 view;
uniform mat4 proj;

uniform float time;
uniform float aspect;
uniform vec2 resolution;

void main() {
    gl_Position = proj * view * translate * vec4(vertex, 1);
}

必须传递glm矩阵的QMatrix4x4转置矩阵

然后就不用了

shaders->setUniformValue(projIndex, QMatrix4x4(glm::value_ptr(proj)) );
您必须使用:

shaders->setUniformValue(projIndex, QMatrix4x4(glm::value_ptr(proj)).transposed());
每次在组合QMatrix4x4和glm::mat4时都必须发送转置矩阵

它应该会起作用

JC


PS:为了记录在案,我也为此挣扎了2天:(

0很可能不允许用于近平面(至少在我知道的所有库中)。只是为了澄清:透视投影不执行线性插值。“
qmatrix4x4x4(glm::value_ptr(proj))
”…什么?你至少验证过GLM和QT的东西在矩阵布局中使用相同的约定了吗?@Nicolas,是的,我使用了一个调试器来确保。其他QMatrix对象(translate,view)所有这些都正常工作,并且投影矩阵中有正确的外观值。我仍然不确定近平面和远平面值的影响:我的所有顶点Z值是否应该在glm::perspective()中设置的近平面和远平面之间,以防止它们被剪裁?