什么时候使用 Qt 在 opengl 中创建渲染上下文?

Posted

技术标签:

【中文标题】什么时候使用 Qt 在 opengl 中创建渲染上下文?【英文标题】:When is the rendering context created in opengl with Qt? 【发布时间】:2011-11-15 16:15:28 【问题描述】:

我正在使用 Qt 试用 OpenGL。我从 Qt 的文档中编译了2dpainting example。在这个例子中,有两个并排的动画,一个在本地运行,另一个由 OpenGL 渲染。我看不出有什么不同。我如何确保使用了硬件加速器。我正在使用 Ångström Linux 的嵌入式设备上运行该示例。

我在 opengl 小部件的构造函数中添加了一行,以确定使用的渲染器,但该函数始终返回一个 NULL 指针。

GLWidget::GLWidget(Helper *helper, QWidget *parent)
     : QGLWidget(QGLFormat(QGL::SampleBuffers), parent), helper(helper)
 
        elapsed = 0;
        setFixedSize(200, 200);
        setAutoFillBackground(false);
        printf("  OpenGL Renderer:   %s\n",glGetString(GL_RENDERER)); //added this line

 

现在我在许多在线论坛上读到,我需要一个有效的渲染上下文。但这意味着什么,在使用 Qt 时它是什么时候创建的?我尝试将相同的功能放在 GLWidget 的所有其他功能中,但没有任何运气。

【问题讨论】:

什么硬件,显卡驱动支持opengl? @neagoegab:Texas Instrument DM3730 它实际上只支持 OpenGLES 1.1 和 2.0,OpenVG1.0,但是 Qt 示例编译并运行没有问题。这就是为什么我试图找出发生了什么。 【参考方案1】:

我相信它会尽可能晚地初始化,即在实际需要绘制某些东西时。

来自QGLWidget::paintEvent() 文档:

处理在 event 参数中传递的绘制事件。将导致调用虚拟paintGL()函数。 小部件的渲染上下文将成为当前上下文如果尚未调用 initializeGL(),则会调用它

【讨论】:

这是否意味着在调用paintEvent() 后渲染上下文被破坏了? 不一定。但它只是在第一次需要绘制某些东西时才完全初始化。它应该始终在您应该覆盖的 paintGL 虚拟中可用。【参考方案2】:

openGL场景在QGlWidgetpaintGL函数中渲染,一般需要用自己的paintGL函数从QGlWidget派生出来

NeHe教程已经adapted for Qt

【讨论】:

以上是关于什么时候使用 Qt 在 opengl 中创建渲染上下文?的主要内容,如果未能解决你的问题,请参考以下文章

将 OpenGL 应用程序与 Qt 集成?

如何在 Qt 中创建 3D 对象模型的 2D 切片?

如何使用 OpenGL 在 Qt 界面上显示 IPLImage 流进行渲染?

在 Qt 的外部类中使用 OpenGL 上下文

在 OpenGL ES 2.0 中创建精灵类

如何在 OpenGL 中创建调试标记?