我正在尝试创建发光效果。我正在使用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,但我想值得一试。希望其中一些有效!