<OPENGL 11>

这里主要讨论 Bloom效果引发的各种问题,及其解决方案。

记录几个高斯模糊的做法:

https://www.shadertoy.com/view/XdfGDH

https://www.shadertoy.com/view/ltScRG

https://gamedev.stackexchange.com/questions/166182/my-single-pass-gaussian-blur-looks-awful

https://github.com/Jam3/glsl-fast-gaussian-blur

原作者的做法这样的:

注意原作者的贴图从头到尾都不是抗锯齿(MSAA),所以操作起来一路顺手。而且场景也简单就几个贴图。

梁大大已经告诉我MSAA是废品,让我考虑FXAA。

而我的做法是:

hdrFBO里的纹理是多重采样纹理。我一开始想的是直接用FBO一步传递到一个postprocessing的buffer中处理。

也就是渲染只分2部分,一部分渲染场景,第二部分把这个渲染的2个buffer传递到postprocessing先测试。

遇到的问题就是:

1,hdrFBO多重采样纹理FBO渲染场景完成之后必须拷贝到post processing 的FBO.

2,hdrFBO多重采样FBO的第一个场景纹理复制过去到post processing没问题。

3,hdrFBO多重采样的第二个Texture(也就是第二个color attachment)是个多重采样纹理,要传递到post的材质,需要这么传:

4,顺便认识到MSAA的这种设计,直接限制了代码,让代码可以写的更烂

vec4 textureMSAA(sampler2DMS tex,vec2 TexCoords){

    ivec2 texSize = textureSize(tex);
    vec4 mtex=vec4(1);
    for(int i = 0; i < 32; ++i)
    {
        mtex += texelFetch(tex, ivec2(TexCoords*texSize ), i);
    }
    mtex = mtex / 32.0f;
    return mtex;
}
textureMSAA函数
#version 450 core
#extension GL_ARB_shading_language_include : require
#include "/shaders/common/utils.glsl"
#include "/shaders/common/postprocess.glsl"
out vec4 FragColor;
in vec2 TexCoords;
uniform sampler2D sceneImage;
uniform sampler2DMS brightImage;
uniform float exposure;
void main()
{
    vec4 scene = texture(sceneImage,TexCoords);
    vec4 mtex = textureMSAA(brightImage,TexCoords);
    vec3 result = toneMapping(scene.rgb, exposure);
    FragColor = vec4(result,1.0f);

}

猜你喜欢

转载自www.cnblogs.com/gearslogy/p/12623553.html