summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author ImJezze <jezze@gmx.net>2015-10-10 17:02:51 +0200
committer ImJezze <jezze@gmx.net>2015-10-10 17:02:51 +0200
commit534cd86c17b10643deb65d9d5c8ab4df3ae011fb (patch)
tree9e202858d90c3337bf3ab143452e312e6d38fa8d
parent81c15decf84ed406812e1078191d1aa553abbc98 (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.fx13
-rw-r--r--src/emu/emuopts.c6
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.c40
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.h1
-rw-r--r--src/osd/windows/winmain.c1
-rw-r--r--src/osd/windows/winmain.h2
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); }