片段着色器中的背景像素

时间:2015-05-27 18:41:25

标签: opengl

有一些方法可以访问片段着色器中的背景像素,以便更改Alpha混合功能吗?

我尝试从Weighted Blended Order-Independent Transparency的第5页开始实现片段着色器,但我不知道如何获得Ci。

1 个答案:

答案 0 :(得分:2)

在标准OpenGL中,您无法读取片段着色器中颜色缓冲区中的当前值。据我所知,这个功能唯一可用的地方是OpenGL ES(EXT_shader_framebuffer_fetch)的扩展。

我没有研究您链接的论文,但有两个主要选项可以将您当前的渲染与以前渲染的内容混合:

固定功能混合

如果您需要的混合功能由OpenGL支持的混合函数/方程所涵盖,这是最简单且可能最有效的选项。您可以使用glBlendFunc()glBlendEquation()(或更灵活的变体glBlendFuncSeparate()glBlendEquationSeparate())设置混合,启用与glEnable(GL_BLEND)的混合,然后您就可以了画画。

还有一些扩展可以支持更多变体,例如KHR_blend_equation_advanced。当然,与所有扩展一样,您不能指望它们在所有平台上都受支持。

多次通过

如果你确实需要对混合进行可编程控制,你可以随时使用更多的渲染过程。

假设您渲染两个需要混合在一起的传递,并希望将结果放在帧缓冲区C中。传统的顺序是:

set current framebuffer to C
render pass 1
set up and enable blending
render pass 2

现在如果这还不够,你可以渲染第1遍并将2传递到单独的帧缓冲区,然后将它们组合起来:

set current framebuffer to A
render pass 1
set current framebuffer to B
render pass 2
set current framebuffer to C
bind color buffers from framebuffer A and B as textures
draw screen size quad, and sample/combine A and B in fragment shader

此序列中的A和B是具有纹理附件的FBO。因此,您最终得到纹理中每个渲染传递的结果。然后,您可以将两个纹理绑定到最终传递,在片段着色器中对它们进行采样,并以完全可编程的方式组合颜色以生成最终输出。