glOrtho не меняет систему координат в 2D окне? - PullRequest
0 голосов
/ 22 февраля 2019

Так что, если я не понял это неправильно, в стандартном окне OpenGL координаты (0,0) находятся в центре экрана.Я настроил следующую функцию изменения размера, используя glOrtho / glViewport, чтобы установить верхний левый угол как (0,0).Но по какой-то причине рисование точки в точке (0,0) по-прежнему отображается в центре экрана (и оно все еще находится в диапазоне -1/1).

Main

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setTitle("OpenGL");
    w.resize(500,500);
    w.show();
    return a.exec();
}

Mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
{
    setSurfaceType(QWindow::OpenGLSurface);
    QSurfaceFormat format;
    format.setProfile(QSurfaceFormat::CompatibilityProfile);
    format.setVersion(2,1);

    setFormat(format);
    context =new QOpenGLContext;
    context->setFormat(format);
    context->makeCurrent(this);

    openGLFuncions = context->functions();

}
void MainWindow::resizeGL(int w, int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0,w,h,0.0,-1.0,1.0);
    glMatrixMode(GL_MODELVIEW);
}

void MainWindow::paintGL()
{
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glPointSize(10.0f);
    glBegin(GL_POINTS);
        glVertex2f(0.5f,0);
    glEnd();

    glFlush();
}

MainWidow.h

class MainWindow : public QOpenGLWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void updateAnim();
protected:
    virtual void initilizeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
    void resizeEvent(QResizeEvent *event);
    void paintEvent(QPaintEvent *event);
private:
    QOpenGLContext *context;
    QOpenGLFunctions *openGLFuncions;
};

1 Ответ

0 голосов
/ 22 февраля 2019

Я рекомендую не делать никаких вызовов OpenGL, кроме как в MainWindow::initilizeGL и MainWindow::paintGL.

Добавить члена состояния (_vp_valid) в класс MainWindow, который указывает, является ли область просмотра иМатрица проекции была правильно установлена ​​и инициализирована false:

class MainWindow : public QOpenGLWindow
{

    // [...]

private:

   bool _vp_valid = false;

   // [...]
};

Если состояние недопустимо, обновите прямоугольник области просмотра и установите матрицу проекции в MainWindow::paintGL:

void MainWindow::paintGL()
{
    if ( !_vp_valid )
    {
        _vp_valid = true;
        int w = this->width();
        int h = this->height();

        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0.0,w,h,0.0,-1.0,1.0);
        glMatrixMode(GL_MODELVIEW);
    }

    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glPointSize(10.0f);
    glBegin(GL_POINTS);
        glVertex2f(0.5f,0);
    glEnd();

    glFlush();
}

В MainWindow::resizeGL достаточно сделать недействительным состояние:

void MainWindow::resizeGL(int w, int h)
{
    _vp_valid = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...