在后期处理后将FBO纹理与主图像相结合,以实现发光效果



我正在尝试创建发光效果。我正在使用OpenGL ES 3.0。我可以使用模板缓冲区创建对象(立方体(的轮廓,因此我没有问题。我还可以使用 FBO 将此轮廓渲染为纹理,并使用框形模糊或高斯模糊实现模糊效果。但是,我遇到麻烦的部分是将生成的模糊发光轮廓(即后期处理图像(与我的原始对象组合回来,以便它排列在立方体的边缘。我可以将模糊的纹理放大到屏幕上 - 但这会复制高分辨率立方体上的低分辨率模糊 - 这意味着我无法再看到我的立方体,只能看到模糊的轮廓纹理。

问题:如何将两者组合成屏幕上的一个图像?

我想制作一个由两个图像组成的复合图像。

这可能很简单,但我想不出一种方法来做到这一点。伪代码会有所帮助。

谢谢

我想你想要这两个图像的加法混合,对吗?我想到了两种方法。请注意,使用加法混合时,随着值的求和,您会自动获得更亮的颜色。

1( 如果纹理中同时具有原始立方体和模糊立方体,请使用如下所示的片段着色器渲染单个屏幕大小的四边形:

#version 300 es
precision mediump float;
uniform sampler2D originalTexture;
uniform sampler2D blurTexture;
in vec2 texCoord;
void main()
{
    vec4 originalColor = texture(originalTexture, texCoord);
    vec4 blurColor     = texture(blurTexture,     texCoord);
    gl_FragColor = originalColor+blurColor;
}

这种方法的优点是您可以轻松地向颜色添加乘数以微调效果,例如,如果光线过多,则调低发光。

或者,您也可以从几何体正常渲染立方体。在这种情况下,只需将纹理查找从模糊纹理添加到片段着色器,然后添加颜色值。

2(您可以利用固定功能混合。首先像往常一样渲染原始立方体,然后设置混合模式:

glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);

现在,当您绑定模糊纹理并渲染到同一渲染目标时,它们应该会重叠并为您提供效果。这给出了与上述着色器等效的结果。您也可以尝试使用glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)来降低结果亮度。此方法应比着色器方法更快。

我不确定混合是否适用于glBlitFramebuffer,但我想值得一试。希望其中一些有效!

最新更新