Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- CRT-Champloo: by Syh
- Licenses: GPL, BSD-3-Clause
- Copyrights for BSD-3-Clause: Ryan Holtz, ImJezze
- Credits: Easymode, guest.r, hunterk
- Special Thanks To: guest.r and hunterk
- */
- #pragma parameter TATE "[Toggle] TATE Mode: (Off/On)" 0.0 0.0 1.0 1.0
- #pragma parameter GAMMA_CRT "[Gamma] CRT:" 2.4 1.0 5.0 0.1
- #pragma parameter SCAN_STYLE "[Scanline] Style:" 1.0 0.0 2.0 1.0
- #pragma parameter SCAN_SHAPE "[Scanline] Shape:" 7.0 1.0 10.0 1.0
- #pragma parameter SCAN_EDGE_SHAPE "[Scanline] Edge Shape:" 9.0 6.0 22.0 1.0
- #pragma parameter SCAN_BEAM_MIN "[Scanline] Dark Strength:" 1.35 0.5 2.0 0.05
- #pragma parameter SCAN_BEAM_MAX "[Scanline] Light Strength:" 1.10 0.5 2.0 0.05
- #pragma parameter SCAN_BEAM_SIZE "[Scanline] Bright Beam Boost:" 0.65 0.0 1.0 0.05
- #pragma parameter h_sharp "[Display] Horizontal Sharpness:" 5.25 1.5 20.0 0.25
- #pragma parameter s_sharp "[Display] Subtractive Sharpness:" 0.05 0.0 0.20 0.01
- #pragma parameter h_smart "[Display] Horizontal Smoothing:" 0.0 0.0 1.0 0.1
- #pragma parameter MASK_SCALE "[Mask] Scale: (HD/4k)" 1.0 1.0 2.0 1.0
- #pragma parameter MASK_STYLE "[Mask] Style:" 2.0 -1.0 7.0 1.0
- #pragma parameter MASK_DARK "[Mask] Dark Phosphor:" 0.7 0.0 2.0 0.1
- #pragma parameter MASK_LIGHT "[Mask] Light Phosphor:" 1.1 0.0 2.0 0.1
- #pragma parameter MASK_CUT "[Mask] Style 5&6 Cutoff:" 0.2 0.0 0.5 0.05
- #pragma parameter SLOT_MASK "[Slot-Mask] Strength:" 0.0 0.0 1.0 0.05
- #pragma parameter SLOT_WIDTH "[Slot-Mask] Width:" 2.0 2.0 6.0 0.5
- #pragma parameter DOUBLE_SLOT "[Slot-Mask] Height: (HD/4k)" 1.0 1.0 2.0 1.0
- #pragma parameter BLOOM_WIDTH "[Bloom] Width:" 0.65 0.05 1.0 0.05
- #pragma parameter BLOOM_HEIGHT "[Bloom] Height:" 0.65 0.05 1.0 0.05
- #pragma parameter BLOOM_HALATION "[Bloom] Halation:" 0.10 0.0 1.0 0.01
- #pragma parameter BLOOM_DIFFUSION "[Bloom] Diffusion:" 0.10 0.0 1.0 0.01
- #pragma parameter DPS_BRIGHTNESS "[Display] Brightness:" 1.5 0.0 2.0 0.05
- #pragma parameter GAMMA_DISPLAY "[Gamma] Display:" 2.2 1.0 5.0 0.1
- #pragma parameter CURVE_CORNER "[Curvature] Corner Size:" 0.0 0.0 0.05 0.01
- #pragma parameter CURVE_X "[Curvature] Horizontal:" 0.0 0.0 0.125 0.01
- #pragma parameter CURVE_Y "[Curvature] Vertical:" 0.0 0.0 0.125 0.01
- #pragma parameter XFX_STATIC "[Effect] Static:" 0.0 0.0 18.0 3.0
- #pragma parameter XFX_HUMBAR "[Effect] Humbar:" 0.0 0.0 1.0 0.01
- #pragma parameter XFX_VIGNETTE "[Effect] Vignette:" 0.0 0.0 1.0 0.01
- #pragma parameter XFX_PVM_COLOR "[Effect] PVM-ish Color Shift:" 0.0 0.0 0.25 0.01
- #pragma parameter OS "R. Bloom Overscan Mode" 2.0 0.0 2.0 1.0
- #pragma parameter R_BLOOM "Raster bloom %" 0.0 0.0 20.0 1.0
- #define Coord TEX0
- #if defined(VERTEX)
- #if __VERSION__ >= 130
- #define OUT out
- #define IN in
- #define tex2D texture
- #else
- #define OUT varying
- #define IN attribute
- #define tex2D texture2D
- #endif
- #ifdef GL_ES
- #define PRECISION mediump
- #else
- #define PRECISION
- #endif
- IN vec4 VertexCoord;
- IN vec4 Color;
- IN vec2 TexCoord;
- OUT vec4 color;
- OUT vec2 Coord;
- uniform mat4 MVPMatrix;
- uniform PRECISION int FrameDirection;
- uniform PRECISION int FrameCount;
- uniform PRECISION vec2 OutputSize;
- uniform PRECISION vec2 TextureSize;
- uniform PRECISION vec2 InputSize;
- void main()
- {
- gl_Position = MVPMatrix * VertexCoord;
- color = Color;
- Coord = TexCoord;
- }
- #elif defined(FRAGMENT)
- #if __VERSION__ >= 130
- #define IN in
- #define tex2D texture
- out vec4 FragColor;
- #else
- #define IN varying
- #define FragColor gl_FragColor
- #define tex2D texture2D
- #endif
- #ifdef GL_ES
- #ifdef GL_FRAGMENT_PRECISION_HIGH
- precision highp float;
- #else
- precision mediump float;
- #endif
- #define PRECISION mediump
- #else
- #define PRECISION
- #endif
- uniform PRECISION int FrameDirection;
- uniform PRECISION int FrameCount;
- uniform PRECISION vec2 OutputSize;
- uniform PRECISION vec2 TextureSize;
- uniform PRECISION vec2 InputSize;
- uniform sampler2D Texture;
- uniform sampler2D PassPrev3Texture;
- uniform sampler2D PassPrev4Texture;
- IN vec2 Coord;
- #ifdef PARAMETER_UNIFORM
- uniform PRECISION float TATE;
- uniform PRECISION float GAMMA_CRT, GAMMA_DISPLAY, DPS_BRIGHTNESS;
- uniform PRECISION float h_sharp, s_sharp, h_smart;
- uniform PRECISION float SCAN_STYLE, SCAN_SHAPE, SCAN_EDGE_SHAPE, SCAN_BEAM_MIN, SCAN_BEAM_MAX, SCAN_BEAM_SIZE;
- uniform PRECISION float MASK_SCALE, MASK_STYLE, MASK_DARK, MASK_LIGHT, MASK_CUT;
- uniform PRECISION float SLOT_MASK, SLOT_WIDTH, DOUBLE_SLOT;
- uniform PRECISION float BLOOM_WIDTH, BLOOM_HEIGHT, BLOOM_HALATION, BLOOM_DIFFUSION;
- uniform PRECISION float CURVE_CORNER, CURVE_X, CURVE_Y;
- uniform PRECISION float XFX_STATIC, XFX_HUMBAR, XFX_VIGNETTE, XFX_PVM_COLOR;
- uniform PRECISION float OS;
- uniform PRECISION float R_BLOOM;
- #else
- #define TATE 0.00 // TATE Mode Toggle, Off/On
- #define GAMMA_CRT 2.40 // Simulated CRT, Gamma (2.25 - 2.40) is recommened
- #define h_sharp 5.25 // pixel sharpness
- #define s_sharp 0.05 // substractive sharpness
- #define h_smart 0.00 // smart horizontal smoothing
- #define SCAN_STYLE 1.00 // Alternative Scanline Styles, (0 is Mild, 1 is a Middle Ground, 2 is Trinitron-ish)
- #define SCAN_SHAPE 7.00 // Scanline, Center Sharpness
- #define SCAN_EDGE_SHAPE 9.00 // Scanline, Edge Sharpness
- #define SCAN_BEAM_MIN 1.30 // Scanline, Dark Area Beam Min - Narrow
- #define SCAN_BEAM_MAX 1.10 // Scanline, Light Area Beam Max - Wide
- #define SCAN_BEAM_SIZE 0.65 // increased max. beam size
- #define MASK_SCALE 1.00 // Mask, Scale (HD/4k)
- #define MASK_STYLE 5.00 // Alternative Mask Styles, (-1 is Mask-Off, 1-4 are Shadow-Masks, 5-6 are Trinitron-ish Masks, 7 is for Slot-Mask)
- #define MASK_DARK 0.50 // Mask, Dark Phosphor Strength
- #define MASK_LIGHT 1.50 // Mask, Light Phosphor Strength
- #define MASK_CUT 0.20 // Mask, Cutoff for Styles 5-7
- #define SLOT_MASK 0.00 // Slot-Mask, Strength
- #define SLOT_WIDTH 2.00 // Slot-Mask, Width
- #define DOUBLE_SLOT 1.00 // Slot-Mask, Height (HD/4k)
- #define BLOOM_WIDTH 0.65 // Bloom, Width
- #define BLOOM_HEIGHT 0.65 // Bloom, Height
- #define BLOOM_HALATION 0.10 // Bloom, Halation Strength
- #define BLOOM_DIFFUSION 0.10 // Bloom, Diffusion Strength
- #define DPS_BRIGHTNESS 1.50 // Simulated CRT, Brightness
- #define GAMMA_DISPLAY 2.20 // Display, Gamma Correction
- #define CURVE_CORNER 0.00 // Curvature, Corner Size
- #define CURVE_X 0.03 // Curvature, X-Axis (0.03) is recommened
- #define CURVE_Y 0.04 // Curvature, Y-Axis (0.04) is recommened
- #define XFX_STATIC 0.00 // Effect, Static Strength
- #define XFX_HUMBAR 0.00 // Effect, Hum-Bar Strength
- #define XFX_VIGNETTE 0.00 // Effect, Vignette Strength
- #define XFX_PVM_COLOR 0.00 // PVM-ish Color Shift
- #define OS 2.00 // Do overscan
- #define R_BLOOM 0.00 // Bloom overscan percentage
- #endif
- #define FIX(c) max(abs(c), 1e-5)
- #define PI 3.141592653589
- #define saturate(c) clamp(c, 0.0, 1.0)
- #define TEX2D(c) pow(tex2D(tex, c).rgb, vec3(GAMMA_CRT))
- #define TEX2DD(c) pow(tex2D(PassPrev3Texture, c).rgb, vec3(GAMMA_CRT))
- #define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize
- #define OutputSize vec4(OutputSize, 1.0 / OutputSize)
- float TimeMilliseconds = float(mod(FrameCount, 1000)) * 3.; // multiplier used to get humbar up to speed
- float HumBarDesync = 60.0 / 59.94 - 1.0; // difference between the 59.94 Hz field rate and 60 Hz line frequency (NTSC)
- mat3 get_color_matrix(sampler2D tex, vec2 co, vec2 dx)
- {
- return mat3(TEX2D(co - dx), TEX2D(co), TEX2D(co + dx));
- }
- vec3 blur(mat3 m, float dist, float rad)
- {
- vec3 x = vec3(dist - 1.0, dist, dist + 1.0) / rad;
- vec3 w = exp2(x * x * -1.0);
- return (m[0] * w.x + m[1] * w.y + m[2] * w.z) / (w.x + w.y + w.z);
- }
- vec3 filter_gaussian(sampler2D tex, vec2 co, vec2 tex_size)
- {
- vec2 dx = vec2(1.0 / tex_size.x, 0.0);
- vec2 dy = vec2(0.0, 1.0 / tex_size.y);
- if (TATE > 0.5)
- {
- dy = vec2(1.0 / tex_size.x, 0.0);
- dx = vec2(0.0, 1.0 / tex_size.y);
- }
- vec2 pix_co = co * tex_size;
- vec2 tex_co = (floor(pix_co) + 0.5) / tex_size;
- vec2 dist = (fract(pix_co) - 0.5) * -1.0;
- if (TATE > 0.5)
- {
- dist = dist.yx;
- }
- mat3 line0 = get_color_matrix(tex, tex_co - dy, dx);
- mat3 line1 = get_color_matrix(tex, tex_co, dx);
- mat3 line2 = get_color_matrix(tex, tex_co + dy, dx);
- mat3 column = mat3(blur(line0, dist.x, BLOOM_WIDTH),
- blur(line1, dist.x, BLOOM_WIDTH),
- blur(line2, dist.x, BLOOM_WIDTH));
- return blur(column, dist.y, BLOOM_HEIGHT);
- }
- float st(float x, float scanline)
- {
- return exp2(-scanline*x*x);
- }
- vec3 sw0(vec3 x, vec3 color, float scanline)
- {
- vec3 tmp = mix(vec3(SCAN_BEAM_MIN),vec3(SCAN_BEAM_MAX), color);
- vec3 ex = x*tmp;
- return exp2(-scanline*ex*ex);
- }
- vec3 sw1(vec3 x, vec3 color, float scanline)
- {
- float mx = max(max(color.r, color.g),color.b);
- x = mix (x, SCAN_BEAM_MIN*x, max(x-0.4*mx,0.0));
- vec3 tmp = mix(vec3(1.2*SCAN_BEAM_MIN),vec3(SCAN_BEAM_MAX), color);
- vec3 ex = x*tmp;
- float br = clamp(0.8*SCAN_BEAM_MIN - 1.0, 0.2, 0.45);
- return exp2(-scanline*ex*ex)/(1.0-br+br*color);
- }
- vec3 sw2(vec3 x, vec3 color, float scanline)
- {
- vec3 tmp = mix(vec3(2.75*SCAN_BEAM_MIN),vec3(SCAN_BEAM_MAX), color);
- tmp = mix(vec3(SCAN_BEAM_MAX), tmp, pow(x, vec3(max(max(color.r, color.g),color.b)+0.3)));
- vec3 ex = x*tmp;
- return exp2(-scanline*ex*ex)/(0.6 + 0.4*color);
- }
- // Shadow mask (1-4 from PD CRT Lottes shader).
- vec3 Mask(vec2 pos, vec3 c)
- {
- pos = floor(pos/MASK_SCALE);
- vec3 mask = vec3(MASK_DARK, MASK_DARK, MASK_DARK);
- float mx = max(max(c.r,c.g),c.b);
- // No mask
- if (MASK_STYLE == -1.0)
- {
- mask = vec3(1.0);
- }
- // Phosphor.
- else if (MASK_STYLE == 0.0)
- {
- pos.x = fract(pos.x*0.5);
- if (pos.x < 0.5) { mask.r = 1.1; mask.g = 0.7; mask.b = 1.1; }
- else { mask.r = 0.7; mask.g = 1.1; mask.b = 0.7; }
- }
- // Very compressed TV style shadow mask.
- else if (MASK_STYLE == 1.0)
- {
- float line = MASK_LIGHT;
- float odd = 0.0;
- if (fract(pos.x/6.0) < 0.5)
- odd = 1.0;
- if (fract((pos.y + odd)/2.0) < 0.5)
- line = MASK_DARK;
- pos.x = fract(pos.x/3.0);
- if (pos.x < 0.333) mask.r = MASK_LIGHT;
- else if (pos.x < 0.666) mask.g = MASK_LIGHT;
- else mask.b = MASK_LIGHT;
- mask*=line;
- }
- // Aperture-grille.
- else if (MASK_STYLE == 2.0)
- {
- pos.x = fract(pos.x/3.0);
- if (pos.x < 0.333) mask.r = MASK_LIGHT;
- else if (pos.x < 0.666) mask.g = MASK_LIGHT;
- else mask.b = MASK_LIGHT;
- }
- // Stretched VGA style shadow mask (same as prior shaders).
- else if (MASK_STYLE == 3.0)
- {
- pos.x += pos.y*3.0;
- pos.x = fract(pos.x/6.0);
- if (pos.x < 0.333) mask.r = MASK_LIGHT;
- else if (pos.x < 0.666) mask.g = MASK_LIGHT;
- else mask.b = MASK_LIGHT;
- }
- // VGA style shadow mask.
- else if (MASK_STYLE == 4.0)
- {
- pos.xy = floor(pos.xy*vec2(1.0, 0.5));
- pos.x += pos.y*3.0;
- pos.x = fract(pos.x/6.0);
- if (pos.x < 0.333) mask.r = MASK_LIGHT;
- else if (pos.x < 0.666) mask.g = MASK_LIGHT;
- else mask.b = MASK_LIGHT;
- }
- // Alternate mask 5
- else if (MASK_STYLE == 5.0)
- {
- vec3 maskTmp = vec3( min( 1.25*max(mx-MASK_CUT,0.0)/(1.0-MASK_CUT) ,MASK_DARK + 0.2*(1.0-MASK_DARK)*mx));
- float adj = 0.80*MASK_LIGHT - 0.5*(0.80*MASK_LIGHT - 1.0)*mx + 0.75*(1.0-mx);
- mask = maskTmp;
- pos.x = fract(pos.x/2.0);
- if (pos.x < 0.5)
- { mask.r = adj;
- mask.b = adj;
- }
- else mask.g = adj;
- }
- // Alternate mask 6
- else if (MASK_STYLE == 6.0)
- {
- vec3 maskTmp = vec3( min( 1.33*max(mx-MASK_CUT,0.0)/(1.0-MASK_CUT) ,MASK_DARK + 0.225*(1.0-MASK_DARK)*mx));
- float adj = 0.80*MASK_LIGHT - 0.5*(0.80*MASK_LIGHT - 1.0)*mx + 0.75*(1.0-mx);
- mask = maskTmp;
- pos.x = fract(pos.x/3.0);
- if (pos.x < 0.333) mask.r = adj;
- else if (pos.x < 0.666) mask.g = adj;
- else mask.b = adj;
- }
- // Alternate mask 7
- else if (MASK_STYLE == 7.0)
- {
- float maskTmp = min(1.6*max(mx-MASK_CUT,0.0)/(1.0-MASK_CUT) ,1.0 + 0.6*(1.0-mx));
- mask = vec3(maskTmp);
- pos.x = fract(pos.x/2.0);
- if (pos.x < 0.5) mask = vec3(1.0 + 0.6*(1.0-mx));
- }
- return mask;
- }
- float SlotMask(vec2 pos, vec3 c)
- {
- if (SLOT_MASK == 0.0) return 1.0;
- float mx = pow(max(max(c.r,c.g),c.b),1.33);
- float mlen = SLOT_WIDTH*2.0;
- float px = fract(pos.x/mlen);
- float py = floor(fract(pos.y/(2.0*DOUBLE_SLOT))*2.0*DOUBLE_SLOT);
- float slot_dark = mix(1.0-SLOT_MASK, 1.0-0.80*SLOT_MASK, mx);
- float slot = 1.0 + 0.7*SLOT_MASK*(1.0-mx);
- if (py == 0.0 && px < 0.5) slot = slot_dark; else
- if (py == DOUBLE_SLOT && px >= 0.5) slot = slot_dark;
- return slot;
- }
- // Distortion of scanlines, and end of screen alpha (torridgristle's curvature)
- vec2 Warp(vec2 pos)
- {
- vec2 Distortion = vec2(CURVE_X, CURVE_Y) * 15.;
- vec2 curvedCoords = pos * 2.0 - 1.0;
- float curvedCoordsDistance = sqrt(curvedCoords.x*curvedCoords.x+curvedCoords.y*curvedCoords.y);
- curvedCoords = curvedCoords / curvedCoordsDistance;
- curvedCoords = curvedCoords * (1.0-pow(vec2(1.0-(curvedCoordsDistance/1.4142135623730950488016887242097)),(1.0/(1.0+Distortion*0.2))));
- curvedCoords = curvedCoords / (1.0-pow(vec2(0.29289321881345247559915563789515),(1.0/(vec2(1.0)+Distortion*0.2))));
- curvedCoords = curvedCoords * 0.5 + 0.5;
- return curvedCoords;
- }
- vec2 Overscan(vec2 pos, float dx, float dy){
- pos=pos*2.0-1.0;
- pos*=vec2(dx,dy);
- return pos*0.5+0.5;
- }
- // Borrowed from cgwg's crt-geom, under GPL
- float corner(vec2 coord)
- {
- coord *= SourceSize.xy / InputSize.xy;
- coord = (coord - vec2(0.5)) * 1.0 + vec2(0.5);
- coord = min(coord, vec2(1.0)-coord) * vec2(1.0, OutputSize.y/OutputSize.x);
- vec2 cdist = vec2(max(CURVE_CORNER,0.002));
- coord = (cdist - min(coord,cdist));
- float dist = sqrt(dot(coord,coord));
- return clamp((cdist.x-dist)*700.0,0.0, 1.0);
- }
- float GetVignetteFactor(vec2 cooord, float amount)
- {
- vec2 VignetteCoord = cooord;
- float VignetteLength = length(VignetteCoord);
- float VignetteBlur = (amount * 0.75) + 0.75;
- // 0.5 full screen fitting circle
- float VignetteRadius = 1.75 - (amount * 0.25);
- float Vignette = smoothstep(VignetteRadius, VignetteRadius - VignetteBlur, VignetteLength);
- return saturate(Vignette);
- }
- //https://www.shadertoy.com/view/4sXSWs strength= 16.0
- vec3 filmGrain(vec2 uv, float strength )
- {
- float x = (uv.x + 4.0 ) * (uv.y + 4.0 ) * ((mod(vec2(FrameCount, FrameCount).x, 800.0) + 10.0) * 10.0);
- return vec3(mod((mod(x, 13.0) + 1.0) * (mod(x, 123.0) + 1.0), 0.01)-0.005) * strength;
- }
- void main()
- {
- vec3 lum = tex2D(PassPrev4Texture, vec2(0.33,0.33)).xyz;
- float factor = 1.00 + (1.0-0.5*OS)*R_BLOOM/100.0 - lum.x*R_BLOOM/100.0;
- vec2 R_Coord = Overscan(Coord*(SourceSize.xy/InputSize.xy), factor, factor)*(InputSize.xy/SourceSize.xy);
- vec2 pos = Warp(R_Coord.xy*(TextureSize.xy/InputSize.xy))*(InputSize.xy/TextureSize.xy);
- vec2 pos0 = Warp(Coord.xy*(TextureSize.xy/InputSize.xy))*(InputSize.xy/TextureSize.xy);
- vec3 film_grain = filmGrain(Coord, XFX_STATIC);
- vec3 col_glow = filter_gaussian(Texture, pos, TextureSize);
- vec2 ps = SourceSize.zw;
- vec2 OGL2Pos = pos * SourceSize.xy - ((TATE < 0.5) ?
- vec2(0.0,0.5) : vec2(0.5, 0.0));
- vec2 fp = fract(OGL2Pos);
- vec2 dx0 = vec2(ps.x,0.0);
- vec2 dy0 = vec2(0.0, ps.y);
- vec2 pC5 = floor(OGL2Pos) * ps + 0.5*ps;
- // Reading the texels
- vec2 x20 = 2.0*dx0;
- vec2 y20 = 2.0*dy0;
- vec2 offx = dx0;
- vec2 off2 = x20;
- vec2 offy = dy0;
- float fpx = fp.x;
- if(TATE > 0.5)
- {
- offx = dy0;
- off2 = y20;
- offy = dx0;
- fpx = fp.y;
- }
- bool sharp = (s_sharp > 0.0);
- float hsharp_tl, hsharp_tr, hsharp_bl, hsharp_br, hsharp_tc, hsharp_bc;
- if (h_smart == 0.0)
- {
- hsharp_tl = h_sharp; hsharp_tr = h_sharp; hsharp_bl = h_sharp; hsharp_br = h_sharp; hsharp_tc = h_sharp; hsharp_bc = h_sharp;
- }
- else
- {
- // reading differences for smoothing
- vec3 diffs_top = tex2D(PassPrev4Texture, pC5 ).xyz;
- vec3 diffs_bot = tex2D(PassPrev4Texture, pC5 + offy).xyz;
- if(TATE > 0.5)
- {
- diffs_top.x = floor(10.0*diffs_top.z)*0.11111; diffs_top.y = fract(10.0*diffs_top.z)*1.11111;
- diffs_bot.x = floor(10.0*diffs_bot.z)*0.11111; diffs_bot.y = fract(10.0*diffs_bot.z)*1.11111;
- }
- float ls = mix (4.5, 2.25, h_smart);
- hsharp_tl = mix(h_sharp, ls, diffs_top.x);
- hsharp_tr = mix(h_sharp, ls, diffs_top.y);
- hsharp_bl = mix(h_sharp, ls, diffs_bot.x);
- hsharp_br = mix(h_sharp, ls, diffs_bot.y);
- hsharp_tc = hsharp_tl;
- hsharp_bc = hsharp_bl;
- if (fpx == 0.5) { hsharp_tc = 0.5*(hsharp_tl + hsharp_tr); hsharp_bc = 0.5*(hsharp_bl + hsharp_br); }
- if (fpx > 0.5) { hsharp_tc = hsharp_tr; hsharp_bc = hsharp_bl; }
- }
- float wl20 = 1.5 + fpx; wl20*=wl20; float twl2 = exp2(-hsharp_tl*wl20); twl2 = max(twl2 - s_sharp, -twl2); float bwl2 = exp2(-hsharp_bl*wl20); bwl2 = max(bwl2 - s_sharp, -bwl2);
- float wl10 = 0.5 + fpx; wl10*=wl10; float twl1 = exp2(-hsharp_tl*wl10); twl1 = max(twl1 - s_sharp, -0.4*s_sharp); float bwl1 = exp2(-hsharp_bl*wl10); bwl1 = max(bwl1 - s_sharp, -0.4*s_sharp);
- float wct = 0.5 - fpx; wct*=wct; float twct = exp2(-hsharp_tc*wct); twct = max(twct - s_sharp, s_sharp); float bwct = exp2(-hsharp_bc*wct); bwct = max(bwct - s_sharp, s_sharp);
- float wr10 = 1.5 - fpx; wr10*=wr10; float twr1 = exp2(-hsharp_tr*wr10); twr1 = max(twr1 - s_sharp, -0.4*s_sharp); float bwr1 = exp2(-hsharp_br*wr10); bwr1 = max(bwr1 - s_sharp, -0.4*s_sharp);
- float wr20 = 2.5 - fpx; wr20*=wr20; float twr2 = exp2(-hsharp_tr*wr20); twr2 = max(twr2 - s_sharp, -twr2); float bwr2 = exp2(-hsharp_br*wr20); bwr2 = max(bwr2 - s_sharp, -bwr2);
- float wtt = 1.0/(twl2+twl1+twct+twr1+twr2);
- float wtb = 1.0/(bwl2+bwl1+bwct+bwr1+bwr2);
- vec3 l20 = TEX2DD( pC5 -off2).xyz;
- vec3 l10 = TEX2DD( pC5 -offx).xyz;
- vec3 ct = TEX2DD( pC5 ).xyz;
- vec3 r10 = TEX2DD( pC5 +offx).xyz;
- vec3 r20 = TEX2DD( pC5 +off2).xyz;
- vec3 color1 = (l20*twl2 + l10*twl1 + ct*twct + r10*twr1 + r20*twr2)*wtt;
- if (sharp) color1 = clamp(color1, min(min(l10,r10),ct), max(max(l10,r10),ct));
- l20 = TEX2DD( pC5 -off2 +offy).xyz;
- l10 = TEX2DD( pC5 -offx +offy).xyz;
- ct = TEX2DD( pC5 +offy).xyz;
- r10 = TEX2DD( pC5 +offx +offy).xyz;
- r20 = TEX2DD( pC5 +off2 +offy).xyz;
- vec3 color2 = (l20*bwl2 + l10*bwl1 + ct*bwct + r10*bwr1 + r20*bwr2)*wtb;
- if (sharp) color2 = clamp(color2, min(min(l10,r10),ct), max(max(l10,r10),ct));
- // calculating scanlines
- float f = (TATE < 0.5) ? fp.y : fp.x;
- float shape1 = mix(SCAN_SHAPE, SCAN_EDGE_SHAPE, f);
- float shape2 = mix(SCAN_SHAPE, SCAN_EDGE_SHAPE, 1.0-f);
- float wt1 = st(f, shape1);
- float wt2 = st(1.0-f, shape2);
- vec3 color0 = color1*wt1 + color2*wt2;
- vec3 ctmp = color0/(wt1+wt2);
- vec3 tmp = pow(ctmp, vec3(1.0/GAMMA_DISPLAY));
- vec3 w1,w2 = vec3(0.0);
- vec3 cref1 = mix(ctmp, color1, SCAN_BEAM_SIZE);
- vec3 cref2 = mix(ctmp, color2, SCAN_BEAM_SIZE);
- vec3 shift = vec3(-XFX_PVM_COLOR, XFX_PVM_COLOR, -XFX_PVM_COLOR);
- vec3 f1 = clamp(vec3(f) + shift*0.5*(1.0+f), 0.0, 1.0);
- vec3 f2 = clamp(vec3(1.0-f) - shift*0.5*(2.0-f), 0.0, 1.0);
- if (SCAN_STYLE == 0.0) { w1 = sw0(f1,cref1,shape1); w2 = sw0(f2,cref2,shape2);} else
- if (SCAN_STYLE == 1.0) { w1 = sw1(f1,cref1,shape1); w2 = sw1(f2,cref2,shape2);} else
- if (SCAN_STYLE == 2.0) { w1 = sw2(f1,cref1,shape1); w2 = sw2(f2,cref2,shape2);}
- vec3 col = color1*w1 + color2*w2;
- // Apply Bloom Halation
- col_glow = saturate(col_glow - col);
- col += col_glow * col_glow * BLOOM_HALATION;
- // Apply Mask
- col *= (TATE < 0.5) ? Mask(gl_FragCoord.xy * 1.000001,col) :
- Mask(gl_FragCoord.yx * 1.000001,col);
- col = min(col,1.0);
- col *= (TATE < 0.5) ? SlotMask(gl_FragCoord.xy * 1.000001,col) :
- SlotMask(gl_FragCoord.yx * 1.000001,col);
- col = pow(col * DPS_BRIGHTNESS, vec3(1.0 / GAMMA_DISPLAY));
- // Apply Bloom
- #define bloompix 1.0 // glow shape, more is harder
- OGL2Pos = pos * TextureSize.xy - vec2(0.5);
- fp = fract(OGL2Pos);
- vec2 pC4 = floor(OGL2Pos) / TextureSize.xy + 0.5/TextureSize.xy;
- vec2 dx = vec2(1.0/TextureSize.x, 0.0);
- vec2 dy = vec2(0.0, 1.0/TextureSize.y);
- vec2 x2 = 2.0*dx; vec2 x3 = 3.0*dx;
- vec2 y2 = 2.0*dy; vec2 y3 = 3.0*dy;
- float wl3 = 2.0 + fp.x; wl3*=wl3; wl3 = exp2(-bloompix*wl3);
- float wl2 = 1.0 + fp.x; wl2*=wl2; wl2 = exp2(-bloompix*wl2);
- float wl1 = fp.x; wl1*=wl1; wl1 = exp2(-bloompix*wl1);
- float wr1 = 1.0 - fp.x; wr1*=wr1; wr1 = exp2(-bloompix*wr1);
- float wr2 = 2.0 - fp.x; wr2*=wr2; wr2 = exp2(-bloompix*wr2);
- float wr3 = 3.0 - fp.x; wr3*=wr3; wr3 = exp2(-bloompix*wr3);
- float wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
- vec3 l3 = tex2D(Texture, pC4 -x2 ).xyz; l3*=l3;
- vec3 l2 = tex2D(Texture, pC4 -dx ).xyz; l2*=l2;
- vec3 l1 = tex2D(Texture, pC4 ).xyz; l1*=l1;
- vec3 r1 = tex2D(Texture, pC4 +dx ).xyz; r1*=r1;
- vec3 r2 = tex2D(Texture, pC4 +x2 ).xyz; r2*=r2;
- vec3 r3 = tex2D(Texture, pC4 +x3 ).xyz; r3*=r3;
- vec3 t1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
- l3 = tex2D(Texture, pC4 -x2 -dy).xyz; l3*=l3;
- l2 = tex2D(Texture, pC4 -dx -dy).xyz; l2*=l2;
- l1 = tex2D(Texture, pC4 -dy).xyz; l1*=l1;
- r1 = tex2D(Texture, pC4 +dx -dy).xyz; r1*=r1;
- r2 = tex2D(Texture, pC4 +x2 -dy).xyz; r2*=r2;
- r3 = tex2D(Texture, pC4 +x3 -dy).xyz; r3*=r3;
- vec3 t2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
- l3 = tex2D(Texture, pC4 -x2 -y2).xyz; l3*=l3;
- l2 = tex2D(Texture, pC4 -dx -y2).xyz; l2*=l2;
- l1 = tex2D(Texture, pC4 -y2).xyz; l1*=l1;
- r1 = tex2D(Texture, pC4 +dx -y2).xyz; r1*=r1;
- r2 = tex2D(Texture, pC4 +x2 -y2).xyz; r2*=r2;
- r3 = tex2D(Texture, pC4 +x3 -y2).xyz; r3*=r3;
- vec3 t3 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
- l3 = tex2D(Texture, pC4 -x2 +dy).xyz; l3*=l3;
- l2 = tex2D(Texture, pC4 -dx +dy).xyz; l2*=l2;
- l1 = tex2D(Texture, pC4 +dy).xyz; l1*=l1;
- r1 = tex2D(Texture, pC4 +dx +dy).xyz; r1*=r1;
- r2 = tex2D(Texture, pC4 +x2 +dy).xyz; r2*=r2;
- r3 = tex2D(Texture, pC4 +x3 +dy).xyz; r3*=r3;
- vec3 b1 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
- l3 = tex2D(Texture, pC4 -x2 +y2).xyz; l3*=l3;
- l2 = tex2D(Texture, pC4 -dx +y2).xyz; l2*=l2;
- l1 = tex2D(Texture, pC4 +y2).xyz; l1*=l1;
- r1 = tex2D(Texture, pC4 +dx +y2).xyz; r1*=r1;
- r2 = tex2D(Texture, pC4 +x2 +y2).xyz; r2*=r2;
- r3 = tex2D(Texture, pC4 +x3 +y2).xyz; r3*=r3;
- vec3 b2 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
- l3 = tex2D(Texture, pC4 -x2 +y3).xyz; l3*=l3;
- l2 = tex2D(Texture, pC4 -dx +y3).xyz; l2*=l2;
- l1 = tex2D(Texture, pC4 +y3).xyz; l1*=l1;
- r1 = tex2D(Texture, pC4 +dx +y3).xyz; r1*=r1;
- r2 = tex2D(Texture, pC4 +x2 +y3).xyz; r2*=r2;
- r3 = tex2D(Texture, pC4 +x3 +y3).xyz; r3*=r3;
- vec3 b3 = (l3*wl3 + l2*wl2 + l1*wl1 + r1*wr1 + r2*wr2 + r3*wr3)*wt;
- wl3 = 2.0 + fp.y; wl3*=wl3; wl3 = exp2(-bloompix*wl3);
- wl2 = 1.0 + fp.y; wl2*=wl2; wl2 = exp2(-bloompix*wl2);
- wl1 = fp.y; wl1*=wl1; wl1 = exp2(-bloompix*wl1);
- wr1 = 1.0 - fp.y; wr1*=wr1; wr1 = exp2(-bloompix*wr1);
- wr2 = 2.0 - fp.y; wr2*=wr2; wr2 = exp2(-bloompix*wr2);
- wr3 = 3.0 - fp.y; wr3*=wr3; wr3 = exp2(-bloompix*wr3);
- wt = 1.0/(wl3+wl2+wl1+wr1+wr2+wr3);
- vec3 Bloom = (t3*wl3 + t2*wl2 + t1*wl1 + b1*wr1 + b2*wr2 + b3*wr3)*wt;
- //Apply Bloom Diffusion
- col = col*col;
- col += Bloom*BLOOM_DIFFUSION;
- col = sqrt(col);
- // Hum-Bar Simulation
- if (XFX_HUMBAR > 0.0)
- {
- float HumBarStep = fract(TimeMilliseconds * HumBarDesync);
- float HumBarBrightness = (TATE < 0.5) ? 1.0 - fract((pos.y * TextureSize.y / InputSize.y) + HumBarStep) * XFX_HUMBAR :
- 1.0 - fract((pos.x * TextureSize.x / InputSize.x) + HumBarStep) * XFX_HUMBAR;
- // Apply Hum-Bar
- col.rgb *= HumBarBrightness;
- }
- // Vignetting Simulation
- if (XFX_VIGNETTE > 0.0)
- {
- vec2 pos1 = pos*(TextureSize.xy/InputSize.xy);
- pos1 = pos1*2.0-1.0;
- vec2 VignetteCoord = pos1;
- float VignetteFactor = GetVignetteFactor(VignetteCoord, XFX_VIGNETTE);
- // Apply Curvature, Vignette, and Static
- FragColor = vec4(col*corner(pos)*VignetteFactor + film_grain, 1.0);
- }
- else FragColor = vec4(col*corner(pos0) + film_grain, 1.0);
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement