java - 将FBO纹理与后处理后的主图像相结合以实现发光效果

标签 java android opengl-es-3.0

我正在尝试创建发光效果。我正在使用 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/

相关文章:

android - 阴影贴图在 Android 上的 OpenGL ES 3.0 中不起作用

java - GluonConnect REST 库会破坏 JSON 字符串中的非英语字符

java - 如何根据 ChildType 对 java.util.ArrayList<ParentType> 进行排序?

java - 保持 Sqlite3 数据库繁忙

android - 文本颜色选择器不起作用

android - 如何让CardView重叠AppBarLayout

android - 如何跨浏览器标准化 Helvetica Neue 行高(与粗体文本无关)?

ios - Metal 顶点着色器绘制纹理的点

java - OpenGL glBufferSubData - 无法让它工作

java - 为什么 ProcessBuilder 类不重写 equals()?