【问题标题】:glOrtho isn't changing coordinate system in 2D window?glOrtho 不会在 2D 窗口中更改坐标系?
【发布时间】:2019-02-22 17:37:25
【问题描述】:

所以除非我理解错了,否则默认的 OpenGL 窗口坐标 (0,0) 位于屏幕的中心。我使用glOrtho/glViewport 设置了以下调整大小函数,将左上角设置为 (0,0)。但是由于某种原因,在 (0,0) 处绘制的点仍然显示在屏幕的中心(并且仍然在 -1/1 范围内)。

主要

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

主窗口.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;
};

【问题讨论】:

  • 您已经实现了MainWindow::resizeEvent。你在那儿做什么?此函数发出调整大小事件并触发对MainWindow::resizeGL 的调用。

标签: c++ qt opengl


【解决方案1】:

我建议不要进行任何 OpenGL 调用,MainWindow::initilizeGLMainWindow::paintGL 除外。

MainWindow 类添加一个状态成员(_vp_valid),指示视口和投影矩阵是否正确设置并初始化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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多