glViewport не работал на Qt5.4 QOpenGLWidget:: resizeGL

Я поставил glViewport в QOpenGLWidget::resizeGL overwritted виртуальной функции, который сделал вам позвонили и установить просмотра использовать только часть виджета пространства. Но это не имело никакого эффекта, контент по-прежнему обращается к полноразмерному виджету. Я что-то пропустил?

вот мой код

mywidget.h:

class MyWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget* parent = NULL);

protected:
    virtual void initializeGL();
    virtual void paintGL();
    virtual void resizeGL(int w, int h);

private:
    QOpenGLShaderProgram program;
};

и mywidget.cpp:

MyWidget::MyWidget(QWidget* parent) : QOpenGLWidget(parent)
{
}

static const GLfloat squareVertices[] = {
    -1.0f, -1.0f,
     1.0f, -1.0f,
    -1.0f,  1.0f
};

void MyWidget::initializeGL()
{
    initializeOpenGLFunctions();
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    program.addShaderFromSourceCode(QOpenGLShader::Vertex,
        "attribute highp vec4 vec;n"
        "void main(void)n"
        "{n"
        "    gl_Position = vec;n"
        "}");
    program.addShaderFromSourceCode(QOpenGLShader::Fragment,
        "void main(void)n"
        "{n"
        "    gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);n"
        "}");
    program.link();
    program.bind();

    program.enableAttributeArray(0);
    program.setAttributeArray(0, squareVertices, 2);
}

void MyWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);

    //glViewport(0, 0, width()/2, height()/2);
    // if I put glViewport here, everything work as intended,
    // but we shouldn't need to set viewport everytime render a frame

    program.bind();
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
}

void MyWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w/2, h/2);
    // this line didn't have any effect, opengl still draw using full widget space
}

2 ответов


glViewport должен вызываться в коде чертежа, т. е. paintGL обработчик, а не где-то еще. Имея glViewport call in the window reshape handler-плохой анти-шаблон, который слишком распространен в учебниках OpenGL; он не принадлежит там.


попробуйте следующее,

void MyWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    GLdouble dWt;
    GLdouble dHt;

    if(w > h) {
        dHt = 1;
        dWt = ((double)w) / h;
    } else {
        dHt = ((double)h) / w;
        dWt = 1;
    }

    if(bPerspective) {
        glFrustum(-dWt, dWt, -dHt, dHt, 5, 100);
    } else {
        glOrtho(-dWt, dWt, -dHt, dHt, 5.0, 100.0);
    }

    gluLookAt(5.0, 2.0, -10.0,
              0.0, 0.0, 0.0,
              0.0, 1.0, 0.0);

    glMatrixMode(GL_MODELVIEW);
}