QGLWidget - 如何使用重绘构建程序

Posted

技术标签:

【中文标题】QGLWidget - 如何使用重绘构建程序【英文标题】:QGLWidget - how to structure a program with overpainting 【发布时间】:2012-07-18 21:02:13 【问题描述】:

这应该很简单:我正在使用 QGLWidget 来绘制一些 openGL 图形,并且我希望能够在渲染的 openGL 图形上写一些东西,所以我使用 QPainter 的 Qt 演示中的重绘。

这是我构建程序的两个工作选择:

// This works but it's probably stupid
paintEvent()


    makeCurrent();

    glewInit();

    loadShaders();

    loadTextures();

    loadBuffers();

    ... actually paint something with openGL ...

    QPainter painter(this);

    ... overpainting ...


------------------------------------------------------------------------------------

// This works and may probably be better
paintEvent()


    QGLWidget::paintEvent(event); // Base class call, this calls initializeGL ONCE and then paintGL each time it's needed

    QPainter painter(this);

    ... overpainting ...


initializeGL()

    glewInit();


paintGL()

    loadShaders();

    loadTextures();

    loadBuffers();

    ... actually paint something with openGL ...

考虑到纹理和着色器并不总是相同,这些选项中的任何一个是否可以接受(在性能和合理方面)?

如果不是:您将如何构建程序?

感谢您的帮助

【问题讨论】:

【参考方案1】:
    initializeGL() 方法中加载/编译/链接着色器,因为那是相对较慢的操作(特别是从磁盘读取时) 在initializeGL() 方法中加载纹理

不确定什么是缓冲区,但听起来应该在初始化时完成,因为它只完成一次。

【讨论】:

可以在那里加载 glew 吗?我没有找到其他加载 glew 的地方 注意:paintEvent 被多次引发,不幸的是,似乎将着色器/纹理/缓冲区(VBO)代码移动到 initializeGL(仅在上下文更改时调用)会导致应用程序不渲染得很好 @JohnnyPauling 不是。 glew 应该在 main 中,因为它需要 main() 中的 argc/argv 该死,由于某种原因,它在主系统中崩溃了。我明天再试一次,但我发现使用 QGLWidget 加载 glew 时唯一没有问题的地方是 initializeGL 在初始化 glContext 之前,您通常无法初始化着色器或 CUDA。但它会避免这样做,直到您重新绘制了一个小部件。所以 initialiseGL 通常是第一次重绘之前调用的最后一个东西

以上是关于QGLWidget - 如何使用重绘构建程序的主要内容,如果未能解决你的问题,请参考以下文章

如何让 qGLWidget 在 Visual Studio 中显示

如何强制 QGLWidget 更新屏幕?

QGLWidget - 发生失真

使Print方法在Form_Load事件中起作用,如何对窗体的属性进行设置?

SwiftUI:在设备方向上重绘会使计时器无效

如何将 QWidget 添加到 QGLWidget