我有一个应用程序,它使用OpenGl的固定管道在屏幕上渲染图像以及一些GUI。在此之前,我想使用基于着色器的管道,对图像进行一些图像处理操作,并将其渲染为纹理。然后我将这个纹理传递给现有的应用程序。基本上当前的流程如下:
cpu image --> gpu texture --> fixed-pipeline processing --> display on screen
我希望看起来像这样:
cpu image --> gpu texture --> rendering passes to enhance the image --> gpu texture --> fixed-pipeline processing --> display on screen
我的问题是:如何在这些不同的操作模式之间切换? 我之前已经看过一些问题(1,2,3,4),但没有人回答我的具体问题。也许只是解开Vertex Arrays的一个简单问题?
现在我对@Reto Koradi的这个问题有了一个很好的答案,我还有另一个问题:你知道这种模式改变需要花多少时间吗?有什么'冲洗'当我切换回固定管道时继续?
答案 0 :(得分:1)
从基于着色器的渲染切换回固定管道:
glUseProgram(0);
从FBO渲染切换回渲染到默认帧缓冲:
glBindFramebuffer(GL_FRAMEBUFFER, 0);
您可以在固定管道中使用顶点数组。但是如果你想取消绑定你的顶点数组/缓冲区,那就是同样的事情。只需绑定0即可释放绑定,例如:
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
编辑:回答关于开销的后续问题。
简单的答案是......这取决于。某些操作的开销可能因平台/硬件而异。至于它可以用相对一般的术语来回答: