photoEffectHelper top-level constant

String const photoEffectHelper

Implementation

const String photoEffectHelper = """

vec3 SepiaColor(float gray, float sepiaFactor) {
    vec3 sepiaColor = vec3(112.0 / 255.0, 66.0 / 255.0, 20.0 / 255.0);
    vec3 one3 = vec3(1.0);
    vec3 color = gray <= 0.5 ?
                 sepiaColor * 2.0 * gray :
                 one3 - 2.0 * (1.0 - gray) * (one3 - sepiaColor);

    return vec3(gray) + sepiaFactor * (color - vec3(gray));
}

// additive blend of red and blue channels
vec3 Technicolor1(vec3 inColor, float amount) {
     vec2 bgFilter = vec2(1.0, 0.7);
     float bg = dot(inColor.bg, bgFilter) * 0.5;
     return mix(inColor, vec3(inColor.r, vec2(bg) * bgFilter), amount);
}

// multiplicative blend of red and blue channels
vec3 Technicolor2(vec3 inColor, float amount) {
    // TODO: simply this mess
    vec3 redfilter       = vec3(1.0, 0.0, 0.0);
    vec3 bluegreenfilter = vec3(0.0, 1.0, 1.0);
    vec3 cyanfilter      = vec3(0.0, 1.0, 0.5);
    vec3 magentafilter   = vec3(1.0, 0.0, 0.25);

	  vec3 redrecord       = inColor * redfilter;
	  vec3 bluegreenrecord = inColor * bluegreenfilter;

	  vec3 rednegative = vec3(redrecord.r);
	  vec3 bluegreennegative = vec3((bluegreenrecord.g + bluegreenrecord.b) * 0.5);

	  vec3 redoutput = rednegative + cyanfilter;
	  vec3 bluegreenoutput = bluegreennegative + magentafilter;

	  vec3 result = redoutput * bluegreenoutput;

	  return mix(inColor, result, amount);
}

//  matting between all channels.
vec3 Technicolor3(vec3 inColor, float amount) {
  vec3 matte = vec3(1.0) - inColor + (inColor.gbr + inColor.brg) * 0.5;
 	return mix(inColor, inColor * matte.gbr * matte.brg, amount);
}

// cyan, magenta, yellow and red/orange filters
vec3 Technicolor4(vec3 inColor, float amount) {
    // TODO: simply this mess
    vec3 greenfilter     = vec3(0.0, 1.0, 0.0);
    vec3 magentafilter   = vec3(1.0, 0.0, 1.0);
    vec3 redorangefilter = vec3(0.99, 0.263, 0.0);
    vec3 cyanfilter      = vec3(0.0, 1.0, 1.0);
    vec3 yellowfilter    = vec3(1.0, 1.0, 0.0);

    vec3 greenrecord = inColor * greenfilter;
	  vec3 bluerecord  = inColor * magentafilter;
    vec3 redrecord   = inColor * redorangefilter;

    vec3 rednegative   = vec3((redrecord.r + redrecord.g + redrecord.b) / 3.0);
	  vec3 greennegative = vec3((greenrecord.r + greenrecord.g + greenrecord.b) / 3.0);
	  vec3 bluenegative  = vec3((bluerecord.r + bluerecord.g + bluerecord.b ) / 3.0);

	  vec3 redoutput   = rednegative + cyanfilter;
	  vec3 greenoutput = greennegative + magentafilter;
	  vec3 blueoutput  =  bluenegative + yellowfilter;

	  vec3 result = redoutput * greenoutput * blueoutput;
    return mix(inColor, result, amount);
}

float VignettingFactor(vec2 uv, float innerRadius, float outerRadius) {
	float d = distance(vec2(0.5, 0.5), uv) * 1.414213;
	return clamp((outerRadius - d) / (outerRadius - innerRadius), 0.0, 1.0);
}
""";