QtQuick QQuickItem Рендеринг Простой треугольник Заполняет весь экран квадратом

Изменение образца, найденного здесь http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html. Я считаю, что у меня есть правильная программа OpenGL, но она, похоже, неправильно отображается с использованием классов-оболочек Qt. Как и в приведенном выше примере, после того, как все подключено, я изменил только функцию рисования. Это выглядит следующим образом:

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.
...

person Matthew Hoggan    schedule 06.03.2015    source источник
comment
Не используйте 0.0 в качестве координаты w. Это вызовет деление на ноль и вызовет головную боль от обрезки. Вместо этого используйте 1.0 или просто оставьте его и используйте позицию трехмерной вершины, потому что GL автоматически назначит вам 1.0, если вы это сделаете.   -  person Andon M. Coleman    schedule 06.03.2015
comment
@ AndonM.Coleman хорошо, что я избавился от большого красного прямоугольника, но теперь у меня черный экран. Я изменил положение камеры на 1.0, предполагая, что объект может быть слишком маленьким. Любые идеи относительно того, почему это может происходить?   -  person Matthew Hoggan    schedule 06.03.2015
comment
Учитывая то, что я вижу в ваших матрицах просмотра модели и проекции, этот треугольник находится на вашей ближней плоскости отсечения, если вы расположите камеру в z=1.0. Попробуйте переместить положение глаза на несколько единиц дальше по оси Z. В идеале вы должны начать в пространстве NDC (вид модели идентичности и матрица проекции), а затем, как только вы таким образом получите видимый на экране треугольник, начните вводить преобразования камеры; шаги малыша ;)   -  person Andon M. Coleman    schedule 06.03.2015
comment
@AndonM.Coleman Я работал с OpenGL последние 5 лет. Я все время забываю эти детские шаги. Я не хочу возвращаться туда, где остановился.   -  person Matthew Hoggan    schedule 07.03.2015


Ответы (1)


Учитывая то, что я вижу в ваших матрицах просмотра модели и проекции, этот треугольник находится на вашей ближней плоскости отсечения, если вы расположите камеру на z = 1,0. Попробуйте переместить положение глаза на несколько единиц дальше по оси Z. В идеале вы должны начать в пространстве NDC (вид модели идентичности и матрица проекции), а затем, как только вы таким образом получите видимый на экране треугольник, начните вводить преобразования камеры; детские шаги ;) — Андон М. Коулман

person Matthew Hoggan    schedule 19.12.2015