mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-11-25 00:51:29 +11:00
187 lines
4.7 KiB
Plaintext
187 lines
4.7 KiB
Plaintext
#version 450
|
|
|
|
// Modular Image Adjustment
|
|
// Author: hunterk
|
|
// License: Public domain
|
|
|
|
layout(push_constant) uniform Push
|
|
{
|
|
vec4 SourceSize;
|
|
uint FrameCount;
|
|
vec4 OutputSize;
|
|
} registers;
|
|
|
|
layout(std140, set = 0, binding = 0) uniform UBO
|
|
{
|
|
mat4 MVP;
|
|
#include "../include/img/param_floats.h"
|
|
} global;
|
|
|
|
#include "../include/img/helper_macros.h"
|
|
|
|
/////////////////////////////// INCLUDES ////////////////////////////////
|
|
// comment the #include and corresponding line to remove functionality //
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
// Flip image vertically or horizontally
|
|
#include "../include/img/image_flip.h"
|
|
|
|
// Stretching, Zooming, Panning
|
|
#include "../include/img/stretch_zoom_pan.h"
|
|
|
|
// Film grain effect
|
|
#include "../include/img/film_grain.h"
|
|
|
|
// Sharp, antialiased pixels; use with linear filtering
|
|
#include "../include/img/sharpening.h"
|
|
|
|
// Saturation and Luminance
|
|
//#include "../include/img/sat_lum.h"
|
|
#include "../include/img/lum_chrom.h"
|
|
|
|
// Gamma correction
|
|
// exp_gamma is basic pow function
|
|
//#include "../include/img/exp_gamma.h"
|
|
#include "../include/img/gamma_srgb.h"
|
|
|
|
// Mask edges to hide unsightly garbage
|
|
#include "../include/img/border_mask.h"
|
|
|
|
// Change the whitepoint to warmer/cooler
|
|
#include "../include/img/white_point.h"
|
|
|
|
// Add a phosphor mask effect onto the image
|
|
#include "../include/img/subpx_masks.h"
|
|
|
|
// Force integer scaling and custom aspect ratio
|
|
//#include "../include/img/int_ar.h"
|
|
|
|
// Vignette; Darkens image around edges
|
|
//#include "../include/img/vignette.h"
|
|
|
|
|
|
// Black level
|
|
// uncomment only one of the next 2 lines to set black level method
|
|
//#include "../include/img/black_lvl.h"
|
|
#include "../include/img/black_lvl_dogway.h"
|
|
|
|
// Brightness and Contrast control
|
|
// uncomment only one of the next 2 lines to set contract complexity;
|
|
// sigmoidal_con is advanced, bright_con is basic
|
|
#include "../include/img/sigmoidal_con.h"
|
|
//#include "../include/img/bright_con.h"
|
|
|
|
// Adjust color balance and tint
|
|
// uncomment only one of the next 2 lines to set color channel complexity;
|
|
// color mangler is advanced, channel mixer is basic
|
|
//#include "../include/img/col_mangler.h"
|
|
#include "../include/img/channel_mix.h"
|
|
|
|
// 2D screen curvature
|
|
//#include "../include/img/gristle_warp.h"
|
|
//#include "../include/img/lottes_warp.h"
|
|
#include "../include/img/cgwg_warp.h"
|
|
|
|
// Rounded corners
|
|
#include "../include/img/corner.h"
|
|
|
|
////////////////////////////// END INCLUDES //////////////////////////////
|
|
|
|
#pragma stage vertex
|
|
layout(location = 0) in vec4 Position;
|
|
layout(location = 1) in vec2 TexCoord;
|
|
layout(location = 0) out vec2 vTexCoord;
|
|
|
|
void main()
|
|
{
|
|
vec4 pos = Position;
|
|
|
|
// apply axis flip
|
|
pos = flip_pos(pos);
|
|
|
|
gl_Position = global.MVP * pos;
|
|
|
|
vec2 coord = TexCoord.st;
|
|
|
|
// apply crop/zoom/pan
|
|
coord = crop_zoom_pan(TexCoord);
|
|
|
|
// apply integer scaling and aspect ratio
|
|
// coord = int_ar(coord, registers.SourceSize, registers.OutputSize);
|
|
|
|
vTexCoord = coord;
|
|
}
|
|
|
|
#pragma stage fragment
|
|
layout(location = 0) in vec2 vTexCoord;
|
|
layout(location = 0) out vec4 FragColor;
|
|
layout(set = 0, binding = 2) uniform sampler2D Source;
|
|
|
|
//////////////////////////////// LUTS ///////////////////////////////////
|
|
// Use either 1 or 2 color-grading LUTs
|
|
// uncomment only one of the next 2 lines
|
|
//#include "../include/img/lut1.h"
|
|
//#include "../include/img/lut2.h"
|
|
////////////////////////////// END LUTS /////////////////////////////////
|
|
|
|
void main()
|
|
{
|
|
// declare texture coordinates
|
|
vec2 coord = vTexCoord.xy;
|
|
|
|
// apply sharpening to coords
|
|
coord = sharp(vTexCoord, registers.SourceSize);
|
|
|
|
// apply screen curvature
|
|
coord = warp(coord);
|
|
|
|
// sample the texture
|
|
vec3 res = texture(Source, coord).rgb;
|
|
|
|
// apply grain (expects to run in gamma space)
|
|
res = luma_grain(res, vTexCoord.xy, ia_GRAIN_STR, registers.FrameCount);
|
|
// res = rgb_grain(res, vTexCoord.xy, ia_GRAIN_STR, registers.FrameCount);
|
|
|
|
// saturation and luminance (expects to run in gamma space)
|
|
res = sat_lum(res);
|
|
|
|
// contrast
|
|
res = cntrst(res);
|
|
|
|
// apply first gamma transform (linearize)
|
|
// (whether LUT or gamma should come first depends on LUT)
|
|
res = gamma_in(res);
|
|
|
|
// apply LUT1
|
|
// res = lut1(res);
|
|
|
|
// apply white point adjustment
|
|
res = white_point(res);
|
|
|
|
// black level
|
|
res = black_level(res);
|
|
|
|
// channel mix
|
|
res = channel_mix(res);
|
|
|
|
// overscan mask
|
|
res = border_mask(res, coord.xy);
|
|
|
|
// apply LUT2 (whether LUT or gamma should come first depends on LUT)
|
|
// res = lut2(res);
|
|
|
|
// apply gamma curve
|
|
res = gamma_out(res);
|
|
|
|
// apply mask effect
|
|
res *= mask_weights(gl_FragCoord.xy, mask_strength, mask);
|
|
|
|
// apply vignette effect
|
|
// res = vignette(res, vTexCoord.xy);
|
|
|
|
// apply rounded corners
|
|
res *= corner(coord);
|
|
|
|
FragColor = vec4(res, 1.0);
|
|
}
|