Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Gaussian Scanlines - Autorotate
- by hunterk
- based on Themaister's NTSC Gauss Pass
- License - Public Domain
- */
- struct data
- {
- float2 tex;
- float2 pix_no;
- float2 one;
- };
- struct input
- {
- float2 video_size;
- float2 texture_size;
- float2 output_size;
- float frame_count;
- };
- void main_vertex
- (
- float4 position : POSITION,
- out float4 oPosition : POSITION,
- uniform float4x4 modelViewProj,
- float2 tex : TEXCOORD,
- uniform input IN,
- out data oData
- )
- {
- oPosition = mul(modelViewProj, position);
- oData.tex = tex;
- oData.pix_no = tex * IN.texture_size;
- oData.one = 1.0 / IN.texture_size;
- }
- #pragma parameter INPUT_GAMMA "Input Gamma" 2.5 0.0 10.0 0.1
- #pragma parameter OUTPUT_GAMMA "Output Gamma" 2.1 0.0 10.0 0.1
- #pragma parameter DARK "Scanline Darkness" 1.0 0.5 5.0 0.1
- #ifdef PARAMETER_UNIFORM
- uniform float INPUT_GAMMA;
- uniform float OUTPUT_GAMMA;
- uniform float DARK;
- #else
- #define INPUT_GAMMA 2.5
- #define OUTPUT_GAMMA 2.1
- #define DARK 3.0
- #endif
- float4 main_fragment (uniform input IN, in data vertex, uniform sampler2D s0 : TEXUNIT0) : COLOR
- {
- #define TEX(off) pow(tex2D(s0, vertex.tex + off).rgb, float3(INPUT_GAMMA))
- float verttest;
- float offset_dist;
- float3 frame0;
- float3 frame1;
- float3 frame2;
- float3 frame3;
- float3 frame4;
- if (IN.video_size.x > IN.video_size.y)
- {
- offset_dist = frac(vertex.pix_no.y) - 0.5;
- frame0 = TEX(float2(0.0, (-2.0) * vertex.one.y));
- frame1 = TEX(float2(0.0, (-1.0) * vertex.one.y));
- frame2 = TEX(float2(0.0, (0.0) * vertex.one.y));
- frame3 = TEX(float2(0.0, (1.0) * vertex.one.y));
- frame4 = TEX(float2(0.0, (2.0) * vertex.one.y));
- }
- else
- {
- offset_dist = frac(vertex.pix_no.x) - 0.5;
- frame0 = TEX(float2((-2.0) * vertex.one.x, 0.0));
- frame1 = TEX(float2((-1.0) * vertex.one.x, 0.0));
- frame2 = TEX(float2((0.0) * vertex.one.x, 0.0));
- frame3 = TEX(float2((1.0) * vertex.one.x, 0.0));
- frame4 = TEX(float2((2.0) * vertex.one.x, 0.0));
- }
- float dist0 = 2.0 + offset_dist;
- float dist1 = 1.0 + offset_dist;
- float dist2 = 0.0 + offset_dist;
- float dist3 = -1.0 + offset_dist;
- float dist4 = -2.0 + offset_dist;
- float3 scanline = frame0 * exp(-5.0 * DARK * dist0 * dist0);
- scanline += frame1 * exp(-5.0 * DARK * dist1 * dist1);
- scanline += frame2 * exp(-5.0 * DARK * dist2 * dist2);
- scanline += frame3 * exp(-5.0 * DARK * dist3 * dist3);
- scanline += frame4 * exp(-5.0 * DARK * dist4 * dist4);
- return float4(pow((1.0 + 0.15 * DARK) * scanline, float3(1.0 / OUTPUT_GAMMA)), 1.0);
- }
Advertisement
Add Comment
Please, Sign In to add comment