Welcome to Fractal Forums

Fractal Software => Fragmentarium => Topic started by: 3dickulus on May 27, 2016, 05:15:25 AM




Title: Adding to the Buffershader (Lens Flare)
Post by: 3dickulus on May 27, 2016, 05:15:25 AM
Lens Flare

any ideas on how to make this work with tiled render and work better with subframes ???
edit: fixed subframes?

add these lines to the #group Post in 3Dkn-1.0.1.frag
Code:
uniform bool  LensFlare; checkbox[false]
uniform float FlareIntensity; slider[0,0.25,1]
uniform int   FlareSamples; slider[1,8,9]
uniform float FlareDispersal; slider[0.0,0.25,1.0]
uniform float FlareHaloWidth; slider[0.0,0.5,1.0]
uniform float FlareDistortion; slider[0.0,1.0,2.0]

add this to BufferShader-1.0.1.frag right before  the line vec4 bloom(vec2 pos, vec2 quality){//see: https://gist.github.com/BlackBulletIV/4218802
Code:
/*----------------------------------------------------------------------------*/
// modified from...
// http://john-chapman-graphics.blogspot.ca/2013/02/pseudo-lens-flare.html
uniform bool LensFlare;
uniform float FlareIntensity;
uniform int   FlareSamples;
uniform float FlareDispersal;
uniform float FlareHaloWidth;
uniform float FlareDistortion;

vec4 textureDistorted(
        in sampler2D tex,
        in vec2 texcoord,
        in vec2 direction,
        in vec4 distortion
) {
        return vec4(
                texture2D(tex, texcoord + direction * distortion.r).r,
                texture2D(tex, texcoord + direction * distortion.g).g,
                texture2D(tex, texcoord + direction * distortion.b).b,
                texture2D(tex, texcoord + direction * distortion.a).a
        );
}

vec4 lensflare(vec2 texcoord, vec2 texelSize) {

        vec2 ghostVec = (vec2(0.5) - texcoord) * FlareDispersal;
        vec2 ghostVecNorm = normalize(ghostVec);
        vec2 haloVec = normalize(ghostVec) * FlareHaloWidth;
        vec4 distortion = vec4(-texelSize.x * FlareDistortion, 0.0, texelSize.x * FlareDistortion, 0.0);

// sample ghosts:
        vec4 result = vec4(0.0);
        for (int i = 0; i < FlareSamples; ++i) {
                vec2 offset = fract(texcoord + ghostVec * float(i));
                float weight = pow(1.0 - (length(vec2(0.5) - offset) / length(vec2(0.5))), 10.0);
                result += textureDistorted( frontbuffer,offset,ghostVecNorm,distortion ) * weight;
        }

//      sample halo:
        float weight = pow(1.0 - (length(vec2(0.5) - fract(texcoord + haloVec)) / length(vec2(0.5))), 10.0);
        result += textureDistorted( frontbuffer, fract(texcoord + haloVec), ghostVecNorm, distortion ) * weight;
        return result;
}
/*----------------------------------------------------------------------------*/


and in the main() routine add this somewhere, right after the test and call to bloom seems to work
Code:
	if(LensFlare) {
                vec4 lf=lensflare(pos,pixelsiz);
                lf=lf/lf.w;
                c += FlareIntensity*lf.xyz;
        }

and you get this...

edit: John Chapman informed me that this use of his code is fine :D (yes I actually asked him)