diff options
Diffstat (limited to 'src/osd/modules/render')
3 files changed, 116 insertions, 38 deletions
diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc index beba1f1743f..4aa3719c0ab 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc @@ -13,19 +13,11 @@ uniform vec4 u_swap_xy; uniform vec4 u_source_dims; // size of the guest machine uniform vec4 u_target_dims; uniform vec4 u_target_scale; -uniform vec4 u_quad_dims; uniform vec4 u_screen_scale; uniform vec4 u_screen_offset; // uniform vec4 u_back_color; // TODO // User-supplied -uniform vec4 u_scanline_alpha; -uniform vec4 u_scanline_scale; -uniform vec4 u_scanline_bright_scale; -uniform vec4 u_scanline_bright_offset; -uniform vec4 u_scanline_jitter; -uniform vec4 u_scanline_height; -uniform vec4 u_scanline_variation; uniform vec4 u_shadow_tile_mode; uniform vec4 u_shadow_alpha; uniform vec4 u_shadow_count; @@ -38,14 +30,13 @@ uniform vec4 u_floor; // Parametric uniform vec4 u_time; // milliseconds -uniform vec4 u_jitter_amount; // Samplers SAMPLER2D(s_tex, 0); SAMPLER2D(s_shadow, 1); //----------------------------------------------------------------------------- -// Scanline & Shadowmask Pixel Shader +// Shadowmask Pixel Shader //----------------------------------------------------------------------------- vec2 GetAdjustedCoords(vec2 coord) @@ -148,34 +139,6 @@ void main() BaseColor.g = pow(BaseColor.g, u_power.g); BaseColor.b = pow(BaseColor.b, u_power.b); - // Scanline Simulation - if (u_scanline_alpha.x > 0.0f) - { - float BrightnessOffset = (u_scanline_bright_offset.x * u_scanline_alpha.x); - float BrightnessScale = (u_scanline_bright_scale.x * u_scanline_alpha.x) + (1.0 - u_scanline_alpha.x); - - float ColorBrightness = 0.299 * BaseColor.r + 0.587 * BaseColor.g + 0.114 * BaseColor.b; - - float ScanCoord = BaseCoord.y; - ScanCoord += u_swap_xy.x > 0.0 - ? u_quad_dims.x <= u_source_dims.x * 2.0 - ? 0.5 / u_quad_dims.x // uncenter scanlines if the quad is less than twice the size of the source - : 0.0 - : u_quad_dims.y <= u_source_dims.y * 2.0 - ? 0.5 / u_quad_dims.y // uncenter scanlines if the quad is less than twice the size of the source - : 0.0; - - ScanCoord *= u_source_dims.y * u_scanline_scale.x * 3.1415927; // PI - - float ScanCoordJitter = u_scanline_jitter.x * u_jitter_amount.x * 1.5707963; // half PI - float ScanSine = sin(ScanCoord + ScanCoordJitter); - float ScanlineWide = u_scanline_height.x + u_scanline_variation.x * max(1.0, u_scanline_height.x) * (1.0 - ColorBrightness); - float ScanSineScaled = pow(ScanSine * ScanSine, ScanlineWide); - float ScanBrightness = ScanSineScaled * BrightnessScale + BrightnessOffset * BrightnessScale; - - BaseColor.rgb *= mix(vec3(1.0, 1.0, 1.0), vec3(ScanBrightness, ScanBrightness, ScanBrightness), u_scanline_alpha.xxx); - } - // Hum Bar Simulation if (u_humbar_alpha.x > 0.0f) { diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc new file mode 100644 index 00000000000..5942c75bab6 --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc @@ -0,0 +1,101 @@ +$input v_color0, v_texcoord0 + +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz,ImJezze +//----------------------------------------------------------------------------- +// Scanline Effect +//----------------------------------------------------------------------------- + +#include "common.sh" + +// Autos +uniform vec4 u_swap_xy; +uniform vec4 u_source_dims; // size of the guest machine +uniform vec4 u_target_dims; +uniform vec4 u_quad_dims; +uniform vec4 u_screen_scale; +uniform vec4 u_screen_offset; + +// User-supplied +uniform vec4 u_scanline_alpha; +uniform vec4 u_scanline_scale; +uniform vec4 u_scanline_bright_scale; +uniform vec4 u_scanline_bright_offset; +uniform vec4 u_scanline_jitter; +uniform vec4 u_scanline_height; +uniform vec4 u_scanline_variation; + +// Parametric +uniform vec4 u_time; // milliseconds +uniform vec4 u_jitter_amount; + +// Samplers +SAMPLER2D(s_tex, 0); +SAMPLER2D(s_shadow, 1); + +//----------------------------------------------------------------------------- +// Scanline Pixel Shader +//----------------------------------------------------------------------------- + +vec2 GetAdjustedCoords(vec2 coord) +{ + // center coordinates + coord -= 0.5; + + // apply screen scale + coord *= u_screen_scale.xy; + + // un-center coordinates + coord += 0.5; + + // apply screen offset + coord += u_screen_offset.xy; + + return coord; +} + +void main() +{ + vec2 BaseCoord = GetAdjustedCoords(v_texcoord0); + + // Color + vec4 BaseColor = texture2D(s_tex, BaseCoord); + + // Clamp + if (BaseCoord.x < 0.0 || BaseCoord.y < 0.0 || BaseCoord.x > 1.0 || BaseCoord.y > 1.0) + { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + } + else + { + // Scanline Simulation + if (u_scanline_alpha.x > 0.0f) + { + float BrightnessOffset = (u_scanline_bright_offset.x * u_scanline_alpha.x); + float BrightnessScale = (u_scanline_bright_scale.x * u_scanline_alpha.x) + (1.0 - u_scanline_alpha.x); + + float ColorBrightness = 0.299 * BaseColor.r + 0.587 * BaseColor.g + 0.114 * BaseColor.b; + + float ScanCoord = BaseCoord.y; + ScanCoord += u_swap_xy.x > 0.0 + ? u_quad_dims.x <= u_source_dims.x * 2.0 + ? 0.5 / u_quad_dims.x // uncenter scanlines if the quad is less than twice the size of the source + : 0.0 + : u_quad_dims.y <= u_source_dims.y * 2.0 + ? 0.5 / u_quad_dims.y // uncenter scanlines if the quad is less than twice the size of the source + : 0.0; + + ScanCoord *= u_source_dims.y * u_scanline_scale.x * 3.1415927; // PI + + float ScanCoordJitter = u_scanline_jitter.x * u_jitter_amount.x * 1.5707963; // half PI + float ScanSine = sin(ScanCoord + ScanCoordJitter); + float ScanlineWide = u_scanline_height.x + u_scanline_variation.x * max(1.0, u_scanline_height.x) * (1.0 - ColorBrightness); + float ScanSineScaled = pow(ScanSine * ScanSine, ScanlineWide); + float ScanBrightness = ScanSineScaled * BrightnessScale + BrightnessOffset * BrightnessScale; + + BaseColor.rgb *= mix(vec3(1.0, 1.0, 1.0), vec3(ScanBrightness, ScanBrightness, ScanBrightness), u_scanline_alpha.xxx); + } + + gl_FragColor = vec4(BaseColor.rgb * v_color0.rgb, BaseColor.a); + } +} diff --git a/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc b/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc new file mode 100644 index 00000000000..405ef8feb3b --- /dev/null +++ b/src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc @@ -0,0 +1,14 @@ +$input a_position, a_texcoord0, a_color0 +$output v_texcoord0, v_color0 + +// license:BSD-3-Clause +// copyright-holders:Dario Manesku + +#include "common.sh" + +void main() +{ + gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0)); + v_texcoord0 = a_texcoord0; + v_color0 = a_color0; +} |