C++ QtQuick QQuickItem渲染简单三角形用四边形填充整个屏幕

C++ QtQuick QQuickItem渲染简单三角形用四边形填充整个屏幕,c++,opengl,qt5.4,C++,Opengl,Qt5.4,修改此处找到的示例。我相信我有一个正确的OpenGL程序,但使用Qt的包装器类似乎无法正确呈现。正如上面的示例一样,在所有东西都连接好之后,我只修改了paint函数。如下所示: void MainScreenRenderer::paint() { if (!m_ShaderProgram) { initializeOpenGLFunctions(); m_ShaderProgram = new QOpenGLShaderProgram();

修改此处找到的示例。我相信我有一个正确的OpenGL程序,但使用Qt的包装器类似乎无法正确呈现。正如上面的示例一样,在所有东西都连接好之后,我只修改了paint函数。如下所示:

void MainScreenRenderer::paint()
{
    if (!m_ShaderProgram) {
        initializeOpenGLFunctions();

        m_ShaderProgram = new QOpenGLShaderProgram();
        m_ShaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex,
            "attribute vec4 vertex;"
            "uniform mat4 mvp;"
            ""
            "void main() {"
            "    gl_Position = mvp * vertex;"
            "}");

        m_ShaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment,
            "void main() {"
            "    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"
            "}");

        m_ShaderProgram->bindAttributeLocation("vertex", 0);
        m_ShaderProgram->link();
    }

    glViewport(0, 0, m_ViewportSize.width(), m_ViewportSize.height());

    m_ShaderProgram->bind();

    m_ShaderProgram->enableAttributeArray(0);

    GLfloat values[] = {
        -1.0, -1.0, +0.0, +0.0,
        +1.0, -1.0, +0.0, +0.0,
        +0.0, +1.0, +0.0, +0.0,
    };

    QMatrix4x4 model;
    QMatrix4x4 view;
    view.lookAt(QVector3D(0.0, 0.0, 10.0), QVector3D(0.0, 0.0, 0.0),
        QVector3D(0.0, 1.0, 0.0));
    QMatrix4x4 projection;
    float aspect = m_ViewportSize.width() / ((m_ViewportSize.height()) ?
        m_ViewportSize.height() : 1);
    projection.perspective(45.0, aspect, 1.0, 1000.0);
    m_MVP = model * view * projection;

    m_ShaderProgram->setAttributeArray(0, GL_FLOAT, values, 4);
    m_ShaderProgram->setUniformValue("mvp", m_MVP);

    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    m_ShaderProgram->disableAttributeArray(0);
    m_ShaderProgram->release();
}
无论我把相机向后拉多远,或者重新调整窗口大小,投影似乎没有任何效果,它只是向整个窗口渲染红色,甚至不接受我刚刚告诉它渲染一个有3个点的三角形的事实。如下图所示


在评论之后,进行了以下更改,但现在我看到的只是一个黑屏

... // Vertex Shader
gl_Position = mvp * vec4(vertex, 1.0);"
...

... // Data
GLfloat values[] = {
        -1.0, -1.0, +0.0,
        +1.0, -1.0, +0.0,
        +0.0, +1.0, +0.0,
    };
...

... // Vertex Attribution Setup
m_ShaderProgram->setAttributeArray(0, GL_FLOAT, values, 3); // Tuple is only 3 tightly packed.
...

根据我在modelview和投影矩阵中看到的情况,如果将摄影机放置在z=1.0,则此三角形位于近剪裁平面上。尝试将眼睛位置沿z轴向下移动几个单位。理想情况下,你应该从NDC空间(身份模型视图和投影矩阵)开始,然后一旦你在屏幕上看到一个三角形,就开始引入相机变换;婴儿步;)-Andon M.Coleman 3月6日20:33不要用0.0作为你的
w
坐标。这会导致除法为零,让你头痛不已。改为使用1.0,或者干脆不使用它,而是使用3D顶点位置,因为如果您这样做,GL将自动为您指定1.0。@AndonM.Coleman好吧,这去掉了大红色矩形,但现在我得到了一个黑屏。我将相机的位置移动到1.0,假设对象可能太小。关于为什么会发生这种情况,你有什么想法吗?根据我看到的模型视图和投影矩阵,如果你将相机放置在
z=1.0
,这个三角形就位于你的近剪裁平面上。尝试将眼睛位置沿z轴向下移动几个单位。理想情况下,你应该从NDC空间(身份模型视图和投影矩阵)开始,然后一旦你在屏幕上看到一个三角形,就开始引入相机变换;婴儿步;)@在过去的5年里,我一直在OpenGL中进进出出。我总是忘记那些婴儿步。我不想回到我刚才停下来的地方。