手动更改帧缓冲区的颜色

时间:2014-08-25 14:10:43

标签: opengl glsl framebuffer

我有一个包含数千架小飞机的场景。设置是平面可以在深度上相互遮挡。

飞机是红色和绿色的。现在我想在着色器中执行以下操作: 渲染所有飞机。一旦平面为红色,从当前绑定的帧缓冲区减去0.5,如果纹理为绿色,则向帧缓冲区添加0.5。 因此,我应该能够看到帧缓冲区纹理中的每个像素:< 0 =>该像素处的红色平面越多,= 0 =>相同数量的红色和绿色,并且对于最后一种情况> 0 =>更多的绿色飞机,以及我可以分辨出来的。

这只是我需要做的非常粗略的简化,但核心是根据影响当前片段的场景中的平面的给定值来写入纹理/帧缓冲区的像素。这应该在片段着色器中发生。

那么如何使用GLSL更改帧缓冲的值?使用gl_FragColor只是设置一种新颜色,但不会操纵之前的颜色。

PS我也会停用深度测试。

1 个答案:

答案 0 :(得分:4)

片段着色器无法从帧缓冲区读取(旧)值;它只是生成一个新值以放入帧缓冲区。当多个片段输出到同一像素(示例中的重叠平面)时,这些值的组合方式由管道的BLEND函数控制。

您可以通过设置自定义混合功能来完成您想要的效果。 GL_FUNC_ADD混合函数允许添加旧值和新值(带权重);你想要的可能是:

glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);

这将简单地将每个输出像素添加到帧缓冲区中的旧像素(在所有四个通道中;从您的问题中不清楚您是使用1通道,3通道还是4通道帧缓冲​​器) 。然后,您只需要片段着色器输出0.5或-0.5。为了使其有意义,您需要一种支持普通[0..1]范围之外的值的帧缓冲格式,例如GL_RGBA32FGL_R32F