这里主要讨论 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; }
#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); }