Opengl 手动更改帧缓冲区的颜色

Opengl 手动更改帧缓冲区的颜色,opengl,glsl,framebuffer,Opengl,Glsl,Framebuffer,我有一个包含数千架小飞机的场景。设置是平面可以在深度上相互遮挡 飞机是红色和绿色的。现在,我想在着色器中执行以下操作: 渲染所有平面。一旦平面为红色,从当前绑定的帧缓冲区减去0.5,如果纹理为绿色,则向帧缓冲区添加0.5。 因此,对于帧缓冲区纹理中的每个像素,我应该能够看到:该像素处有更多的红色平面,=0=>相同数量的红色和绿色,对于最后一种情况,>0=>更多的绿色平面,并且我可以看出区别 这只是对我需要做的事情的一个非常粗略的简化,但核心是根据场景中影响当前片段的平面的给定值来修改纹理/帧缓冲

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

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

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

那么如何使用GLSL更改帧缓冲区的值呢?使用gl_FragColor只会设置一种新颜色,但不会操作以前设置的颜色


PS我还将停用深度测试。

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

您可以通过设置自定义混合功能来完成所需的操作。
GL\u FUNC\u 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_RGBA32F
GL_R32F

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

您可以通过设置自定义混合功能来完成所需的操作。
GL\u FUNC\u 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\u RGBA32F
GL\u R32F

谢谢。这就是我要找的。这是一个非常优雅的解决我问题的方法。谢谢。这就是我要找的。这是解决我问题的一个非常优雅的方法。