在QT中渲染循环函数以在Windows中渲染opengl



由于QGLWidget不能用于OpenGL/ES,我在Qt中留下了QWidget,以便小部件渲染OpenGL。参考

如果我有下面的renderView函数要在当前窗口中渲染,我正在寻找qt将重复调用的"那个"函数,以便QWidget刷新屏幕,这样我就可以通过重载它来调用该函数中的renderView。

知道如何做这件事或解决常见问题吗?

最初的问题:我不想在1毫秒甚至16.66毫秒的计时器中调用renderView(根据屏幕刷新率)。

class MyWindow
{
void renderView()
{   
if(DeviceContext && RenderingContext)
{
wglMakeCurrent(m_hdc, m_hrc); //Set current context
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);       
// glViewPort.... and render using shaders
SwapBuffers(m_hdc); // Double buffering thats why
}   
}
};
class MyWidget : public QWidget, public MyWindow
{
// What is the function called repeatedly to refresh the screen
// so that i would ask that function to call renderView
};

提前感谢!

由于QGLWidget不能用于OpenGL/ES

好的,在继续前进之前,我们需要澄清一些困惑。。。

可以。这个小部件是为了用OpenGL桌面和嵌入式支持扩展通常的QWidget接口而发明的。请参考以下示例,了解您自己是否可以使用此小部件来实现OpenGL ES功能:

OpenGL Hello GL ES示例

现在,我们可以开门见山地回答您的问题了。您可能应该重新实现以下受保护的方法。

void QGLWidget::paintGL()[虚拟保护]

每当需要绘制小部件时,就会调用此虚拟函数。在子类中重新实现它。

在我们讨论它的同时,还请检查受保护的初始化方法:

void QGLWidget::initializeGL()[virtualprotected]

此虚拟函数在第一次调用paintGL()或resizeGL()之前调用一次,然后在小部件被分配新的QGLContext时调用一次。在子类中重新实现它。

此功能应设置任何所需的OpenGL上下文渲染标志、定义显示列表等。

事实上,您甚至可以根据以下受保护的方法来处理此接口的覆盖:

void QGLWidget::paintOverlayGL()[虚拟保护]

这个虚拟函数的使用方式与paintGL()相同,只是它在小部件的覆盖上下文而不是小部件的主上下文上操作。这意味着,只要需要绘制小部件的覆盖,就会调用paintOverlayGL()。在子类中重新实现它。

void QGLWidget::initializeOverlayGL()[虚拟保护]

这个虚拟函数的使用方式与initializeGL()相同,只是它在小部件的覆盖上下文而不是小部件的主上下文上操作。这意味着initializeOverlayGL()在第一次调用paintOverlayGL[()或resizeOverlayGL]之前被调用一次。在子类中重新实现它。

此函数应为覆盖上下文设置任何所需的OpenGL上下文渲染标志、定义显示列表等。

最新更新