着色器处理后读/写 OpenGL 3.2+ 帧缓冲区
Posted
技术标签:
【中文标题】着色器处理后读/写 OpenGL 3.2+ 帧缓冲区【英文标题】:Read/write OpenGL 3.2+ Framebuffer after shader processing 【发布时间】:2021-02-12 08:17:24 【问题描述】:我有一个程序,我使用 glReadPixels 获取着色器的输出,并使用一些单独的库处理该输出,我需要将其写回帧缓冲区。 我尝试使用 glDrawPixels,但似乎从 3.2+ 开始不支持它。
事情就是这样
main loop
...
...
glReadPixels(...)
// Do some work
...
...
// Write modified buffer to current frame buffer
// Swap buffers
哪种 OpenGL 结构最适合这种情况?
【问题讨论】:
如果你想使用glDrawPixels
,你必须使用兼容配置文件的OpenGL上下文。见18.1 Drawing Pixels
我将 glfw 设置为使用兼容性配置文件,但由于某种原因它给我带来了麻烦。我也想在 Mac OS 上运行它。以下如何:创建一个单独的 FBO,附加一个纹理。在默认帧缓冲区上渲染,使用 glReadPixels,做工作,绑定单独的 FBO 并复制到其附加的纹理,从单独的 FBO 复制到默认值。你怎么看?
【参考方案1】:
我最终选择的解决方案如下:
1.创建第一个 FBO 并将场景渲染到屏幕外 2.使用 glReadPixels 将 FBO 读取到 CPU 内存 3.工作 4.将图像写入纹理 5.使用简单的直通顶点和片段着色器将纹理显示到视口
【讨论】:
以上是关于着色器处理后读/写 OpenGL 3.2+ 帧缓冲区的主要内容,如果未能解决你的问题,请参考以下文章