Qt QOpenGLWidget glClearColor功能不正常

Qt QOpenGLWidget glClearColor not functioning correctly

本文关键字:不正常 功能 glClearColor QOpenGLWidget Qt      更新时间:2023-10-16

当从paintGL()之外的不同地方调用glClearColor时,我有一个小问题。目的是让用户能够在飞行中设置清晰的颜色,但这并不像计划的那样工作,除非在paintGL中每帧调用glClearColor。

目的:

void GLWidget::mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->pos();
    glClearColor(1.0f, 0.0f, 0.0f, 1.0f); //<-- Doesn't change clear colour
}

最优处理:

void GLWidget::mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->pos();
    r = 1.0f;
    g = 0.0f;
    b = 0.0f;
    a = 1.0f;
}
void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glClearColor(r, g, b, a);
...

我认为这与Qt交换缓冲区和更新屏幕的方式有关,但目前尚不清楚究竟是什么导致了它。如果有什么想法就太好了。

我认为这与Qt交换缓冲区和更新屏幕的方式有关,但目前尚不清楚究竟是什么导致了它。有什么好主意就太好了。

错,它与做OpenGL调用没有OpenGL上下文绑定。你必须在做任何OpenGL调用之前调用makeCurrent

为什么它在paintGL中工作呢?因为Qt在调用paintGL, resizeGLinitializeGL之前自动使上下文当前(参见它们的文档)。

我不认为@peppe回答正确,因为你不需要调用makeccurrent(),因为Qt已经

在我看来,你真正需要的只是在mousePressEvent中调用update()

如果你不想调用paintGL()来更新,你只需要调用update()

同样,你应该知道在glClearColor()中,你只在OpenGL状态机上设置clearColor属性。glClear(GL_COLOR_BUFFER_BIT)是真正清除颜色缓冲的函数。所以你应该在调用glClear()之前设置clearColor为glClearColor()

如果我是你,代码会是这样的:

void GLWidget::mousePressEvent(QMouseEvent *event)
{
    m_lastPos = event->pos();
    r = 1.0f;
    g = 0.0f;
    b = 0.0f;
    a = 1.0f;
    update();
}
void GLWidget::paintGL()
{
    glClearColor(r, g, b, a);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);