diff options
author | 2015-10-10 17:02:51 +0200 | |
---|---|---|
committer | 2015-10-10 17:02:51 +0200 | |
commit | 534cd86c17b10643deb65d9d5c8ab4df3ae011fb (patch) | |
tree | 9e202858d90c3337bf3ab143452e312e6d38fa8d | |
parent | 81c15decf84ed406812e1078191d1aa553abbc98 (diff) |
Bloom Overdrive
- added experimental bloom overdrive effect and options, this effect
allows to overdrive pure colors like red, green and blue to become more
brighter
- added lcd.ini to parse_standard_inis()
-rw-r--r-- | hlsl/bloom.fx | 13 | ||||
-rw-r--r-- | src/emu/emuopts.c | 6 | ||||
-rw-r--r-- | src/osd/modules/render/d3d/d3dhlsl.c | 40 | ||||
-rw-r--r-- | src/osd/modules/render/d3d/d3dhlsl.h | 1 | ||||
-rw-r--r-- | src/osd/windows/winmain.c | 1 | ||||
-rw-r--r-- | src/osd/windows/winmain.h | 2 |
6 files changed, 58 insertions, 5 deletions
diff --git a/hlsl/bloom.fx b/hlsl/bloom.fx index 0b3a230bf5b..0bd981ae0e7 100644 --- a/hlsl/bloom.fx +++ b/hlsl/bloom.fx @@ -240,6 +240,8 @@ uniform float4 Level0123Weight; uniform float4 Level4567Weight; uniform float3 Level89AWeight; +uniform float3 OverdriveWeight; + float3 GetNoiseFactor(float3 n, float random) { // smaller n become more noisy @@ -284,6 +286,15 @@ float4 ps_main(PS_INPUT Input) : COLOR texel9 + texelA); + float3 bloomOverdrive = max(0.0f, texel0 + bloom - 1.0f) * OverdriveWeight; + + bloom.r += bloomOverdrive.g * 0.5f; + bloom.r += bloomOverdrive.b * 0.5f; + bloom.g += bloomOverdrive.r * 0.5f; + bloom.g += bloomOverdrive.b * 0.5f; + bloom.b += bloomOverdrive.r * 0.5f; + bloom.b += bloomOverdrive.g * 0.5f; + float2 NoiseCoord = Input.TexCoord01.xy; float3 NoiseFactor = GetNoiseFactor(bloom, random(NoiseCoord)); @@ -291,7 +302,7 @@ float4 ps_main(PS_INPUT Input) : COLOR } //----------------------------------------------------------------------------- -// Downsample Effect +// Bloom Effect //----------------------------------------------------------------------------- technique TestTechnique diff --git a/src/emu/emuopts.c b/src/emu/emuopts.c index 8d2e6c0e56f..b0efd442101 100644 --- a/src/emu/emuopts.c +++ b/src/emu/emuopts.c @@ -452,6 +452,12 @@ void emu_options::parse_standard_inis(std::string &error_string) parse_one_ini("vector", OPTION_PRIORITY_SCREEN_INI, &error_string); break; } + // parse "lcd.ini" for lcd games + if (device->screen_type() == SCREEN_TYPE_LCD) + { + parse_one_ini("lcd", OPTION_PRIORITY_SCREEN_INI, &error_string); + break; + } } // next parse "source/<sourcefile>.ini"; if that doesn't exist, try <sourcefile>.ini diff --git a/src/osd/modules/render/d3d/d3dhlsl.c b/src/osd/modules/render/d3d/d3dhlsl.c index f03ba272e01..2a42c8f9a0e 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.c +++ b/src/osd/modules/render/d3d/d3dhlsl.c @@ -77,7 +77,9 @@ hlsl_options shaders::s_hlsl_presets[4] = 1.2f, false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, 0.9f, 4.0f, - 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f + 1.0f, + { 0.0f, 0.0f, 0.0f }, + 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, { // 25% Shadow mask, 0% Scanlines, 3% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation true, @@ -100,7 +102,9 @@ hlsl_options shaders::s_hlsl_presets[4] = 1.2f, false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, 0.9f, 4.0f, - 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f + 1.0f, + { 0.0f, 0.0f, 0.0f }, + 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, { // 25% Shadow mask, 0% Scanlines, 0% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation true, @@ -123,7 +127,9 @@ hlsl_options shaders::s_hlsl_presets[4] = 1.2f, false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, 0.9f, 4.0f, - 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f + 1.0f, + { 0.0f, 0.0f, 0.0f }, + 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, { // 25% Shadow mask, 100% Scanlines, 15% Pincushion, 3 defocus, 24-degree Tint Out, 1.5 Exponent, 5% Floor, 70% Phosphor Return, 80% Saturation, Bad Convergence true, @@ -146,7 +152,9 @@ hlsl_options shaders::s_hlsl_presets[4] = 0.8f, false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, 0.9f, 4.0f, - 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f + 1.0f, + { 0.0f, 0.0f, 0.0f }, + 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, }; @@ -824,6 +832,7 @@ void shaders::init(base *d3dintf, running_machine *machine, d3d::renderer *rende options->vector_length_scale = winoptions.screen_vector_length_scale(); options->vector_length_ratio = winoptions.screen_vector_length_ratio(); options->bloom_scale = winoptions.screen_bloom_scale(); + get_vector(winoptions.screen_bloom_overdrive(), 3, options->bloom_overdrive, TRUE); options->bloom_level0_weight = winoptions.screen_bloom_lvl0_weight(); options->bloom_level1_weight = winoptions.screen_bloom_lvl1_weight(); options->bloom_level2_weight = winoptions.screen_bloom_lvl2_weight(); @@ -1550,6 +1559,8 @@ int shaders::bloom_pass(render_target *rt, int source_index, poly_info *poly, in curr_effect->set_vector("Level89Size", 4, bloom_dims[8]); curr_effect->set_vector("LevelASize", 2, bloom_dims[10]); + curr_effect->set_vector("OverdriveWeight", 3, options->bloom_overdrive); + curr_effect->set_texture("DiffuseA", rt->prescale_texture[next_index]); char name[9] = "Diffuse*"; @@ -2656,6 +2667,24 @@ static INT32 slider_bloom_scale(running_machine &machine, void *arg, std::string return slider_set(&(((hlsl_options*)arg)->bloom_scale), 0.001f, "%1.3f", str, newval); } +static INT32 slider_bloom_red_overdrive(running_machine &machine, void *arg, std::string *str, INT32 newval) +{ + ((hlsl_options*)arg)->params_dirty = true; + return slider_set(&(((hlsl_options*)arg)->bloom_overdrive[0]), 0.001f, "%1.3f", str, newval); +} + +static INT32 slider_bloom_green_overdrive(running_machine &machine, void *arg, std::string *str, INT32 newval) +{ + ((hlsl_options*)arg)->params_dirty = true; + return slider_set(&(((hlsl_options*)arg)->bloom_overdrive[1]), 0.001f, "%1.3f", str, newval); +} + +static INT32 slider_bloom_blue_overdrive(running_machine &machine, void *arg, std::string *str, INT32 newval) +{ + ((hlsl_options*)arg)->params_dirty = true; + return slider_set(&(((hlsl_options*)arg)->bloom_overdrive[2]), 0.001f, "%1.3f", str, newval); +} + static INT32 slider_bloom_lvl0_scale(running_machine &machine, void *arg, std::string *str, INT32 newval) { ((hlsl_options*)arg)->params_dirty = true; @@ -2789,6 +2818,9 @@ shaders::slider_desc shaders::s_sliders[] = { "Vector Length Attenuation", 0, 80, 100, 1, slider_vector_attenuation }, { "Vector Attenuation Length Limit", 1, 500, 1000, 1, slider_vector_length_max }, { "Bloom Scale", 0, 250, 2000, 5, slider_bloom_scale }, + { "Bloom Red Overdrive", 0, 250, 2000, 5, slider_bloom_red_overdrive }, + { "Bloom Green Overdrive", 0, 250, 2000, 5, slider_bloom_green_overdrive }, + { "Bloom Blue Overdrive", 0, 250, 2000, 5, slider_bloom_blue_overdrive }, { "Bloom Level 0 Scale", 0, 100, 100, 1, slider_bloom_lvl0_scale }, { "Bloom Level 1 Scale", 0, 21, 100, 1, slider_bloom_lvl1_scale }, { "Bloom Level 2 Scale", 0, 19, 100, 1, slider_bloom_lvl2_scale }, diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index 3a337d21a87..6c9c14faaf5 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -239,6 +239,7 @@ struct hlsl_options // Bloom float bloom_scale; + float bloom_overdrive[3]; float bloom_level0_weight; float bloom_level1_weight; float bloom_level2_weight; diff --git a/src/osd/windows/winmain.c b/src/osd/windows/winmain.c index 7096f95f20e..f06b5204dc0 100644 --- a/src/osd/windows/winmain.c +++ b/src/osd/windows/winmain.c @@ -352,6 +352,7 @@ const options_entry windows_options::s_option_entries[] = /* Bloom below this line */ { NULL, NULL, OPTION_HEADER, "BLOOM POST-PROCESSING OPTIONS" }, { WINOPTION_BLOOM_SCALE, "0.25", OPTION_FLOAT, "Intensity factor for bloom" }, + { WINOPTION_BLOOM_OVERDRIVE, "0.0,0.0,0.0",OPTION_STRING, "Overdrive factor for bloom" }, { WINOPTION_BLOOM_LEVEL0_WEIGHT, "1.0", OPTION_FLOAT, "Bloom level 0 (full-size target) weight" }, { WINOPTION_BLOOM_LEVEL1_WEIGHT, "0.21", OPTION_FLOAT, "Bloom level 1 (half-size target) weight" }, { WINOPTION_BLOOM_LEVEL2_WEIGHT, "0.19", OPTION_FLOAT, "Bloom level 2 (quarter-size target) weight" }, diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h index dcb2fdcd1c0..71f0056915b 100644 --- a/src/osd/windows/winmain.h +++ b/src/osd/windows/winmain.h @@ -86,6 +86,7 @@ #define WINOPTION_VECTOR_LENGTH_RATIO "vector_length_ratio" #define WINOPTION_VECTOR_TIME_PERIOD "vector_time_period" #define WINOPTION_BLOOM_SCALE "bloom_scale" +#define WINOPTION_BLOOM_OVERDRIVE "bloom_overdrive" #define WINOPTION_BLOOM_LEVEL0_WEIGHT "bloom_lvl0_weight" #define WINOPTION_BLOOM_LEVEL1_WEIGHT "bloom_lvl1_weight" #define WINOPTION_BLOOM_LEVEL2_WEIGHT "bloom_lvl2_weight" @@ -181,6 +182,7 @@ public: float screen_vector_length_ratio() const { return float_value(WINOPTION_VECTOR_LENGTH_RATIO); } float screen_vector_time_period() const { return float_value(WINOPTION_VECTOR_TIME_PERIOD); } float screen_bloom_scale() const { return float_value(WINOPTION_BLOOM_SCALE); } + const char *screen_bloom_overdrive() const { return value(WINOPTION_BLOOM_OVERDRIVE); } float screen_bloom_lvl0_weight() const { return float_value(WINOPTION_BLOOM_LEVEL0_WEIGHT); } float screen_bloom_lvl1_weight() const { return float_value(WINOPTION_BLOOM_LEVEL1_WEIGHT); } float screen_bloom_lvl2_weight() const { return float_value(WINOPTION_BLOOM_LEVEL2_WEIGHT); } |