2017-08-12 24 views
2

我正在使用QQuickFramebufferObject对象呈现红色三角形到帧缓冲区,它本身被绘制到QML场景。
为此,我重写了关联的QQuickFramebufferObject :: Renderer类的渲染函数。
这使功能看起来像以下:QQuickFramebufferObject重绘只显示清除颜色

void GLRenderEngine::render() 
{ 
    glClearColor(0,0,0,1); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

    glColor3d(1,0,0); 
    glBegin(GL_TRIANGLES); 
     glVertex2d(0,0); 
     glVertex2d(1,0); 
     glVertex2d(0,1); 
    glEnd(); 

    glFlush(); 

    //QQuickWindow context of encapsuling QQuickFramebufferObject 
    //is set in overwritten synchronize call 
    if(m_pWindow) 
    { 
     m_pWindow->resetOpenGLState(); 
     update(); 
    } 
} 

我执政经验的问题是,第一帧被正确绘制,而所有其它帧只显示色彩分明。 我已经分析了福格尔OpenGL的API调用,并张贴结果在引擎收录:

帧0(正确的帧):https://pastebin.com/aWu4ee6m

帧1:https://pastebin.com/4EmWmnMv

唯一的区别,我注意到了初始化电话, Qt在哪里查询状态机状态,所以我很好奇我还做错了什么。
感谢您的帮助。

小更新:

如果我删除glClear(...)的帧显示正确的图像,但我怀疑这是正确的行为。

当我使用glClear时,framebuffer绑定是为我创建的一个Qt使用。它与标志GL_FRAMEBUFFER绑定,这也使绘图。

我从函数返回后,默认的framebuffer(0)被绑定和清除。这个过程可以很好地在框架1中看到。

我一直在想的是glBlitFrameBuffer是否被调用。 Vogl似乎没有接到这个电话,也是在Vogl提供的各个帧缓冲区的预览中,我看不到Frame1中我的红色三角形,而它在Frame0中可见。

+0

你尝试过'glFinish'而不是'glFlush'吗? –

+0

是的,不会改变一件事,可悲的是 – Krustenkaese

+0

你的“正确”的框架0甚至不包含绘制三角形的代码。 – derhass

回答

0

我解决了这个问题,当我比较状态机状态并看到Shader程序从0切换到1时。 在渲染函数的每个开始处将其更改回0,从而禁用阴影程序,导致预期的行为。

相关问题