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 中显示