我正在尝试创建发光效果。我正在使用 OpenGL ES 3.0。我可以使用模板缓冲区创建对象(立方体)的轮廓,所以我对此没有任何问题。我还可以使用 FBO 将此轮廓渲染为纹理,并使用框模糊或高斯模糊实现模糊效果。然而,我遇到麻烦的部分是将生成的模糊发光轮廓(即后处理的图像)与我的原始对象结合起来,以便它排列立方体的边缘。我可以将模糊的纹理传输到屏幕上 - 但这会将低分辨率模糊复制到我的高分辨率立方体上 - 这意味着我无法再看到我的立方体,只能看到模糊的轮廓纹理。
问题:如何将两者合并为屏幕上的一张图像?
我想制作一个由两个图像组成的合成图像。
这可能很简单,但我想不出办法。伪代码会很有帮助。
谢谢
最佳答案
我认为您想要对这两个图像进行加法混合,对吗?我想到了两种方法。请注意,使用加法混合时,当值相加时,您会自动获得更明亮的颜色。
1) 如果纹理中同时具有原始立方体和模糊立方体,请使用 fragment 着色器渲染单个屏幕大小的四边形,如下所示:
#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;
}
这种方法的优点是您可以轻松地向颜色添加乘数来微调效果,例如如果发光太多,请将其调暗。
或者,您可以从几何体正常渲染立方体。在这种情况下,只需将模糊纹理的纹理查找添加到 fragment 着色器,然后添加颜色值即可。
2) 您可以利用固定功能混合。首先像平常一样渲染原始立方体,然后设置混合模式:
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);
现在,当您绑定(bind)模糊纹理并渲染到同一渲染目标时,它们应该重叠并为您提供效果。这给出了与上述着色器等效的结果。您也可以尝试使用 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE)
来降低结果亮度。这种方法应该比着色器方法更快。
我不确定混合是否适用于 glBlitFramebuffer,但我想它值得一试。希望其中一些有效!
关于java - 将FBO纹理与后处理后的主图像相结合以实现发光效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19125119/