0

我正在尝试创建发光效果。我正在使用 OpenGL ES 3.0。我可以使用模板缓冲区创建对象(立方体)的轮廓,所以我对此没有任何问题。我还可以使用 FBO 将此轮廓渲染为纹理,并使用框模糊或高斯模糊实现模糊效果。但是,我遇到问题的部分是得到的模糊辉光轮廓(即后处理图像)与我的原始对象结合起来,以便它排列立方体的边缘。我可以将模糊的纹理粘贴到屏幕上——但这会将低分辨率的模糊复制到的高分辨率立方体上——这意味着我再也看不到我的立方体,只能看到模糊的轮廓纹理。

问题:如何将两者合并为屏幕上的一张图像?

我想制作一个包含两个图像的合成图像。

这可能很简单,但我想不出办法。伪代码会很有帮助。

谢谢

4

1 回答 1

1

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

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)too 来降低结果亮度。这种方法应该比着色器方法更快。

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

于 2013-10-03T06:01:08.670 回答