c++ - Qt 和 OpenGL : change the state outside paintGL function

标签 c++ qt opengl

我使用 Qt Creator 创建了一个非常简单的应用程序,其中包含一个 QOpenGLWidget 和一个 QPushButton,它们应该在每次点击时更改 opengl 小部件的清晰颜色。

enter image description here

这是“核心”代码:

void OpenGLWidget::initializeGL()
{
    qDebug() << "initializeGL";
    initializeOpenGLFunctions();
    glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
}

void OpenGLWidget::paintGL()
{
    qDebug() << "paintGL";
    // changeClearColor();
    glClear(GL_COLOR_BUFFER_BIT);
}

void OpenGLWidget::changeClearColor()
{
    GLfloat color[4];
    glGetFloatv(GL_COLOR_CLEAR_VALUE, color);

    qDebug() << "bef:" << color[0] << color[1] << color[2] << color[3];
    for (int i = 0; i < 4; i++)
    {
        if (color[i] == 0.0f)
        {
            color[i] = 1.0f;
            color[(i+1)%3] = 0.0f;
            break;
        }
    }
    qDebug() << "aft:" << color[0] << color[1] << color[2] << color[3];

    glClearColor(color[0], color[1], color[2], color[3]);
    update();
}

事实上,这段代码的行为并不像我预期的那样。在 changeClearColor 中调用 glGetFloatv 检索颜色值,总是返回 (0, 0, 0, 1),然后更新的颜色将是 (1, 0, 0, 1),即红色。但是这种颜色并没有被渲染。

所以我认为调用 paintGL 之外的库函数无法访问 OpenGL 的当前状态。如果您取消注释 paintGL 中的 changeClearColor 调用,这一次 changeClearColor 将使其起作用,更改每一帧的清除颜色并检索正确的初始颜色 (1, 1, 0, 1),即在 initializeGL 中设置的黄色。

显然,我可以将清除颜色保存在一个“全局”变量中(例如,我的 OpenGLWidget 类的一个属性),然后使用 changeClearColor 和 paintGL 修改并使用该值。但我想了解为什么无法从 changeClearColor 访问和更改 OpenGL 的当前状态,就像在 paintGL 中一样。

最佳答案

在进行任何 OpenGL API 调用之前,您需要确保正确的 OpenGL 上下文处于当前状态。假设 OpenGLWidget 继承自 QOpenGLWidget 尝试...

void OpenGLWidget::changeClearColor()
{
    GLfloat color[4];

    /*
     * Use the correct OpenGL context.
     */
    makeCurrent();
    glGetFloatv(GL_COLOR_CLEAR_VALUE, color);

    qDebug() << "bef:" << color[0] << color[1] << color[2] << color[3];
    for (int i = 0; i < 4; i++)
    {
        if (color[i] == 0.0f)
        {
            color[i] = 1.0f;
            color[(i+1)%3] = 0.0f;
            break;
        }
    }
    qDebug() << "aft:" << color[0] << color[1] << color[2] << color[3];

    glClearColor(color[0], color[1], color[2], color[3]);

    /*
     * Signify we're done with the current OpenGL context.
     */
    doneCurrent();
    update();
}

关于c++ - Qt 和 OpenGL : change the state outside paintGL function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52987120/

相关文章:

c++ - 如何将 C++ 类与 ctypes 一起使用?

c++ - 转发类友声明

c++ - 整数到二进制存储在数组中

qt - 控制附加到 QToolButton 的弹出式 QWidget

c++ - 使用在全局范围内声明的 Qt 本地化字符串

c++ - GLSL 照明作为平面 - 法线问题?

c++ - 捕捉 c++ "Access Violation Writing Exception"?

c++ - Qt:如何让QDialog跟随父级

java - 尽管链接和验证成功,为什么着色器程序无法编译?

opengl - 如何在片段着色器中存储纹理