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

时间:2013-12-27 19:28:04

标签: c++ qt opengl-es render qwidget

由于QGLWidget不能用于OpenGL / ES,我在Qt中留下了QWidget,以便小部件呈现opengl。 Reference

如果我在当前窗口中有渲染的以下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
};

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

由于QGLWidget不能用于OpenGL / ES

是的,我们需要在继续前进之前澄清一些混乱......

可以。这个小部件的发明是为了扩展通常的QWidget界面与OpenGL桌面和嵌入式支持。请参阅以下示例,看看自己是否可以将此小部件用于OpenGL ES功能:

OpenGL Hello GL ES Example

现在,我们可以回答您的问题。您应该重新实现的是以下受保护的方法。

void QGLWidget::paintGL() [virtual protected]

  

只要需要绘制窗口小部件,就会调用此虚函数。在子类中重新实现它。

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

void QGLWidget::initializeGL() [virtual protected]

  

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

     

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

事实上,您甚至可以按照以下受保护的方法处理此界面的叠加层:

void QGLWidget::paintOverlayGL() [virtual protected]

  

此虚函数的使用方式与paintGL()相同,不同之处在于它在窗口小部件的叠加上下文上操作,而不是在窗口小部件的主上下文中操作。这意味着只要需要绘制窗口小部件的叠加层,就会调用paintOverlayGL()。在子类中重新实现它。

void QGLWidget::initializeOverlayGL() [virtual protected]

  

此虚函数的使用方式与initializeGL()相同,不同之处在于它在窗口小部件的叠加上下文上操作,而不是在窗口小部件的主上下文中操作。这意味着在第一次调用paintOverlayGL()或resizeOverlayGL()之前调用initializeOverlayGL()一次。在子类中重新实现它。

     

此函数应设置任何所需的OpenGL上下文渲染标记,为叠加上下文定义显示列表等。