(PS3) Added border shaders - we will need a subrepo for all these shaders eventually

This commit is contained in:
TwinAphex51224 2012-01-26 00:35:14 +01:00 committed by Themaister
parent a07514c88b
commit ab687190a9
14 changed files with 1029 additions and 0 deletions

View File

@ -0,0 +1,77 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 1920x1080 border. :)
// Puts game in middle.
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float in_aspect = 16.0 / 9.0;
const float out_aspect = 4.0 / 3.0;
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD0,
float2 oTex : TEXCOORD0,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
out float2 border,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float dist = tex.x - middle.x;
float x = middle.x + dist.x * in_aspect / out_aspect;
oTex = float2(x, tex.y);
border = float2(0.5 - out_aspect / in_aspect, 0.5 + out_aspect / in_aspect);
otex_border = tex_border;
}
float4 main_fragment (
float2 tex : TEXCOORD0,
float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN,
in float2 border) : COLOR
{
float4 background = tex2D(bg, tex_border);
float4 source_image = tex2D(s0, tex);
float sel;
if (tex.x < border.x || tex.x > border.y)
{
sel = 0.0;
}
else
{
sel = 1.0;
}
return lerp(background, source_image, sel);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 4.0; // 4x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 2.0; // 2x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 1.0; // 1x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 4.0; // 4x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,92 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 4.0; // 4x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float apply_wave(float2 pos, float2 src, float cnt)
{
float2 diff = pos - src;
float dist = 300.0 * sqrt(dot(diff, diff));
dist -= 0.15 * cnt;
return sin(dist);
}
const float2 src0 = float2(0.6, 0.7);
const float2 src1 = float2(0.9, 0.9);
const float2 src2 = float2(-0.6, 0.3);
const float2 src3 = float2(0.1, 0.4);
const float2 src4 = float2(0.1, 0.4);
const float2 src5 = float2(0.5, 0.5);
const float2 src6 = float2(-1.0, 1.0);
float4 conv_background(float4 back, float2 coord, float frame_count)
{
float cnt = frame_count;
float res = apply_wave(coord, src0, cnt);
res += apply_wave(coord, src1, cnt);
res += apply_wave(coord, src2, cnt);
res += apply_wave(coord, src3, cnt);
res += apply_wave(coord, src4, cnt);
res += apply_wave(coord, src5, cnt);
res += apply_wave(coord, src6, cnt);
return float4(back.rgb * (0.7 + 0.05 * res), back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,92 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 2.0; // 2x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float apply_wave(float2 pos, float2 src, float cnt)
{
float2 diff = pos - src;
float dist = 300.0 * sqrt(dot(diff, diff));
dist -= 0.15 * cnt;
return sin(dist);
}
const float2 src0 = float2(0.6, 0.7);
const float2 src1 = float2(0.9, 0.9);
const float2 src2 = float2(-0.6, 0.3);
const float2 src3 = float2(0.1, 0.4);
const float2 src4 = float2(0.1, 0.4);
const float2 src5 = float2(0.5, 0.5);
const float2 src6 = float2(-1.0, 1.0);
float4 conv_background(float4 back, float2 coord, float frame_count)
{
float cnt = frame_count;
float res = apply_wave(coord, src0, cnt);
res += apply_wave(coord, src1, cnt);
res += apply_wave(coord, src2, cnt);
res += apply_wave(coord, src3, cnt);
res += apply_wave(coord, src4, cnt);
res += apply_wave(coord, src5, cnt);
res += apply_wave(coord, src6, cnt);
return float4(back.rgb * (0.7 + 0.05 * res), back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,92 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 1.0; // 1x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float apply_wave(float2 pos, float2 src, float cnt)
{
float2 diff = pos - src;
float dist = 300.0 * sqrt(dot(diff, diff));
dist -= 0.15 * cnt;
return sin(dist);
}
const float2 src0 = float2(0.6, 0.7);
const float2 src1 = float2(0.9, 0.9);
const float2 src2 = float2(-0.6, 0.3);
const float2 src3 = float2(0.1, 0.4);
const float2 src4 = float2(0.1, 0.4);
const float2 src5 = float2(0.5, 0.5);
const float2 src6 = float2(-1.0, 1.0);
float4 conv_background(float4 back, float2 coord, float frame_count)
{
float cnt = frame_count;
float res = apply_wave(coord, src0, cnt);
res += apply_wave(coord, src1, cnt);
res += apply_wave(coord, src2, cnt);
res += apply_wave(coord, src3, cnt);
res += apply_wave(coord, src4, cnt);
res += apply_wave(coord, src5, cnt);
res += apply_wave(coord, src6, cnt);
return float4(back.rgb * (0.7 + 0.05 * res), back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,92 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 4.0; // 4x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.5 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float apply_wave(float2 pos, float2 src, float cnt)
{
float2 diff = pos - src;
float dist = 300.0 * sqrt(dot(diff, diff));
dist -= 0.15 * cnt;
return sin(dist);
}
const float2 src0 = float2(0.6, 0.7);
const float2 src1 = float2(0.9, 0.9);
const float2 src2 = float2(-0.6, 0.3);
const float2 src3 = float2(0.1, 0.4);
const float2 src4 = float2(0.1, 0.4);
const float2 src5 = float2(0.5, 0.5);
const float2 src6 = float2(-1.0, 1.0);
float4 conv_background(float4 back, float2 coord, float frame_count)
{
float cnt = frame_count;
float res = apply_wave(coord, src0, cnt);
res += apply_wave(coord, src1, cnt);
res += apply_wave(coord, src2, cnt);
res += apply_wave(coord, src3, cnt);
res += apply_wave(coord, src4, cnt);
res += apply_wave(coord, src5, cnt);
res += apply_wave(coord, src6, cnt);
return float4(back.rgb * (0.7 + 0.05 * res), back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 4.0; // 4x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.2 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 2.0; // 2x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.2 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 1.0; // 1x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.2 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,67 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 4x input scale, 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float box_scale = 4.0; // 4x scale.
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex : TEXCOORD,
out float2 oTex : TEXCOORD,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
float2 corrected_size = float2(256.0, 224.0) * (4.0 / box_scale);
float2 scale = (IN.output_size / corrected_size) / box_scale;
float2 middle = 0.2 * IN.video_size / IN.texture_size;
float2 diff = tex.xy - middle;
oTex = middle + diff * scale;
middle = float2(0.5, 0.5);
float2 dist = tex_border - middle;
otex_border = middle + dist * IN.output_size / out_res;
}
float4 conv_background(float4 back, float2 coord, float frame_count)
{
return float4(back.rgb, back.a);
}
float4 main_fragment (
float2 tex : TEXCOORD0, float2 tex_border : TEXCOORD1,
uniform sampler2D s0 : TEXUNIT0,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 frame = tex2D(s0, tex);
float4 background = conv_background(tex2D(bg, tex_border), tex_border, IN.frame_count);
return lerp(frame, background, background.a);
}

View File

@ -0,0 +1,48 @@
/*
Author: Themaister
License: Public domain
*/
// Border shader. 1920x1080 border. :)
struct input
{
float2 video_size;
float2 texture_size;
float2 output_size;
float frame_count;
};
const float2 out_res = float2(1920.0, 1080.0); // Output target size.
void main_vertex
(
float4 position : POSITION,
out float4 oPosition : POSITION,
uniform float4x4 modelViewProj,
float4 color : COLOR,
out float4 oColor : COLOR,
float2 tex_border : TEXCOORD1,
out float2 otex_border : TEXCOORD1,
uniform input IN
)
{
oPosition = mul(modelViewProj, position);
oColor = color;
otex_border = tex_border;
}
float4 main_fragment (
float2 tex_border : TEXCOORD1,
uniform sampler2D bg,
uniform input IN) : COLOR
{
float4 background = tex2D(bg, tex_border);
return background;
}