着色器处理后读/写 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+ 帧缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

帧缓冲区和在opengl中使用着色器

打开 gl 计算着色器和帧缓冲区

用于片段着色器的 OpenGL GLSL 绑定采样器

Android OpenGLES3绘图 - 帧缓冲

无法从 OpenGL 中的着色器访问先前渲染的纹理

在OpenGL中绘制到半透明帧缓冲区时如何抗锯齿? [复制]