Merge pull request #745 from ImJezze/pull

Improved appearance
This commit is contained in:
R. Belmont 2016-03-26 21:47:02 -04:00
commit 0bdcf99982
9 changed files with 71 additions and 62 deletions

View File

@ -2,8 +2,9 @@ HLSL-Related Enable Switches
---------------------------- ----------------------------
Name Values Description Name Values Description
hlsl_enable 0/1 Enables HLSL post-processing in Direct3D 9 modes. hlsl_enable 0 or 1 Enables HLSL post-processing in Direct3D 9 modes.
yiq_enable 0/1 Enables YIQ-colorspace post-processing. Causes a hlsl_oversampling 0 or 1 Enables HLSL oversampling.
yiq_enable 0 or 1 Enables YIQ-colorspace post-processing. Causes a
performance drop but gives a much more authentic performance drop but gives a much more authentic
NTSC TV appearance on TV-based systems when configured NTSC TV appearance on TV-based systems when configured
properly. properly.

View File

@ -55,8 +55,6 @@ uniform float2 ScreenDims;
uniform float2 TargetDims; uniform float2 TargetDims;
uniform float2 QuadDims; uniform float2 QuadDims;
uniform int BloomLevel;
uniform bool VectorScreen; uniform bool VectorScreen;
static const float2 Coord0Offset = float2(-0.5f, -0.5f); static const float2 Coord0Offset = float2(-0.5f, -0.5f);

View File

@ -2,7 +2,7 @@
# DIRECT3D POST-PROCESSING OPTIONS # DIRECT3D POST-PROCESSING OPTIONS
# #
shadow_mask_tile_mode 1 shadow_mask_tile_mode 1
shadow_mask_alpha 0.25 shadow_mask_alpha 0.5
shadow_mask_texture monochrome-matrix.png shadow_mask_texture monochrome-matrix.png
shadow_mask_x_count 2 shadow_mask_x_count 2
shadow_mask_y_count 2 shadow_mask_y_count 2
@ -16,20 +16,20 @@ smooth_border 0.0
reflection 0.0 reflection 0.0
vignetting 0.0 vignetting 0.0
scanline_alpha 0.0 scanline_alpha 0.0
defocus 0.0,0.0 defocus 0.5,0.5
converge_x 0.0,0.0,0.0 converge_x 0.0,0.0,0.0
converge_y 0.0,0.0,0.0 converge_y 0.0,0.0,0.0
radial_converge_x 0.0,0.0,0.0 radial_converge_x 0.0,0.0,0.0
radial_converge_y 0.0,0.0,0.0 radial_converge_y 0.0,0.0,0.0
red_ratio 1.0,0.0,0.0 red_ratio 1.0,0.0,0.0
grn_ratio 0.0,1.0,0.0 grn_ratio 0.1,1.0,0.0
blu_ratio 0.0,0.0,1.0 blu_ratio 0.0,0.05,1.0
saturation 1.0 saturation 2.0
offset 0.0,0.0,0.0 offset 0.0,0.10,0.05
scale 1.0,1.0,1.0 scale 0.9,0.8,1.0
power 1.0,1.0,1.0 power 1.4,1.2,1.8
floor 0.0,0.0,0.0 floor 0.0,0.0,0.0
phosphor_life 0.5,0.5,0.5 phosphor_life 0.65,0.65,0.65
# #
# NTSC POST-PROCESSING OPTIONS # NTSC POST-PROCESSING OPTIONS
@ -40,7 +40,7 @@ yiq_enable 0
# BLOOM POST-PROCESSING OPTIONS # BLOOM POST-PROCESSING OPTIONS
# #
bloom_blend_mode 1 bloom_blend_mode 1
bloom_scale 1.0 bloom_scale 0.5
bloom_overdrive 0.0,0.0,0.0 bloom_overdrive 0.0,0.0,0.0
bloom_lvl0_weight 1.0 bloom_lvl0_weight 1.0
bloom_lvl1_weight 0.64 bloom_lvl1_weight 0.64

View File

@ -2,7 +2,7 @@
# CORE VECTOR OPTIONS # CORE VECTOR OPTIONS
# #
antialias 1 antialias 1
beam_width_min 0.50 beam_width_min 0.75
beam_width_max 4.00 beam_width_max 4.00
beam_intensity_weight 0.75 beam_intensity_weight 0.75
flicker 0.15 flicker 0.15
@ -10,6 +10,7 @@ flicker 0.15
# #
# DIRECT3D POST-PROCESSING OPTIONS # DIRECT3D POST-PROCESSING OPTIONS
# #
hlsl_oversampling 0
shadow_mask_tile_mode 0 shadow_mask_tile_mode 0
shadow_mask_alpha 0.5 shadow_mask_alpha 0.5
shadow_mask_texture shadow-mask.png shadow_mask_texture shadow-mask.png
@ -30,7 +31,7 @@ converge_x 0.0,0.0,0.0
converge_y 0.0,0.0,0.0 converge_y 0.0,0.0,0.0
radial_converge_x 0.0,0.0,0.0 radial_converge_x 0.0,0.0,0.0
radial_converge_y 0.0,0.0,0.0 radial_converge_y 0.0,0.0,0.0
red_ratio 1.0,0.0,0.1 red_ratio 1.0,0.0,0.0
grn_ratio 0.0,1.0,0.0 grn_ratio 0.0,1.0,0.0
blu_ratio 0.0,0.0,1.0 blu_ratio 0.0,0.0,1.0
saturation 1.0 saturation 1.0
@ -56,7 +57,7 @@ vector_length_ratio 500.0
# #
bloom_blend_mode 0 bloom_blend_mode 0
bloom_scale 1.50 bloom_scale 1.50
bloom_overdrive 1.50,1.50,1.50 bloom_overdrive 1.00,1.00,1.00
bloom_lvl0_weight 1.00 bloom_lvl0_weight 1.00
bloom_lvl1_weight 0.64 bloom_lvl1_weight 0.64
bloom_lvl2_weight 0.32 bloom_lvl2_weight 0.32

View File

@ -332,32 +332,45 @@ UINT32 vector_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
} }
else else
{ {
float beam_intensity_width = m_beam_width_min;
float intensity = (float)curpoint->intensity / 255.0f; float intensity = (float)curpoint->intensity / 255.0f;
float intensity_weight = normalized_sigmoid(intensity, m_beam_intensity_weight);
// check for dynamic intensity // check for static intensity
if (m_min_intensity != m_max_intensity) float beam_width = m_min_intensity == m_max_intensity
{ ? m_beam_width_min
float intensity_weight = normalized_sigmoid(intensity, m_beam_intensity_weight); : m_beam_width_min + intensity_weight * (m_beam_width_max - m_beam_width_min);
beam_intensity_width = (m_beam_width_max - m_beam_width_min) * intensity_weight + m_beam_width_min;
}
float beam_width = beam_intensity_width * (1.0f / (float)VECTOR_WIDTH_DENOM); // normalize width
beam_width *= 1.0f / (float)VECTOR_WIDTH_DENOM;
coords.x0 = ((float)lastx - xoffs) * xscale; coords.x0 = ((float)lastx - xoffs) * xscale;
coords.y0 = ((float)lasty - yoffs) * yscale; coords.y0 = ((float)lasty - yoffs) * yscale;
coords.x1 = ((float)curpoint->x - xoffs) * xscale; coords.x1 = ((float)curpoint->x - xoffs) * xscale;
coords.y1 = ((float)curpoint->y - yoffs) * yscale; coords.y1 = ((float)curpoint->y - yoffs) * yscale;
// extend zero-length vector line (vector point) by quarter beam_width on both sides float xdistance = coords.x0 - coords.x1;
if (fabs(coords.x0 - coords.x1) < FLT_EPSILON && float ydistance = coords.y0 - coords.y1;
fabs(coords.y0 - coords.y1) < FLT_EPSILON)
// extend zero-length vector line (vector point) by 3/8 beam_width on both sides
if (fabs(xdistance) < FLT_EPSILON &&
fabs(ydistance) < FLT_EPSILON)
{ {
coords.x0 += xratio * beam_width * 0.25f; coords.x0 += xratio * beam_width * 0.375f;
coords.y0 += yratio * beam_width * 0.25f; coords.y0 += yratio * beam_width * 0.375f;
coords.x1 -= xratio * beam_width * 0.25f; coords.x1 -= xratio * beam_width * 0.375f;
coords.y1 -= yratio * beam_width * 0.25f; coords.y1 -= yratio * beam_width * 0.375f;
}
// extend vector line by 3/8 beam_width on both sides
else
{
float length = sqrt(xdistance * xdistance + ydistance * ydistance);
float xdirection = xdistance / length;
float ydirection = ydistance / length;
coords.x0 += xratio * beam_width * 0.375f * (xdirection / xratio);
coords.y0 += yratio * beam_width * 0.375f * (ydirection / yratio);
coords.x1 -= xratio * beam_width * 0.375f * (xdirection / xratio);
coords.y1 -= yratio * beam_width * 0.375f * (ydirection / yratio);
} }
if (curpoint->intensity != 0 && !render_clip_line(&coords, &clip)) if (curpoint->intensity != 0 && !render_clip_line(&coords, &clip))

View File

@ -69,6 +69,7 @@ shaders::shaders() :
{ {
master_enable = false; master_enable = false;
vector_enable = true; vector_enable = true;
oversampling_enable = false;
shadow_texture = nullptr; shadow_texture = nullptr;
options = nullptr; options = nullptr;
paused = true; paused = true;
@ -664,6 +665,7 @@ void shaders::init(d3d_base *d3dintf, running_machine *machine, renderer_d3d9 *r
windows_options &winoptions = downcast<windows_options &>(machine->options()); windows_options &winoptions = downcast<windows_options &>(machine->options());
master_enable = winoptions.d3d_hlsl_enable(); master_enable = winoptions.d3d_hlsl_enable();
oversampling_enable = winoptions.d3d_hlsl_oversampling();
snap_width = winoptions.d3d_snap_width(); snap_width = winoptions.d3d_snap_width();
snap_height = winoptions.d3d_snap_height(); snap_height = winoptions.d3d_snap_height();
@ -945,7 +947,6 @@ int shaders::create_resources(bool reset)
for (int i = 0; i < 13; i++) for (int i = 0; i < 13; i++)
{ {
effects[i]->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS); effects[i]->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS);
effects[i]->add_uniform("SourceRect", uniform::UT_VEC2, uniform::CU_SOURCE_RECT);
effects[i]->add_uniform("TargetDims", uniform::UT_VEC2, uniform::CU_TARGET_DIMS); effects[i]->add_uniform("TargetDims", uniform::UT_VEC2, uniform::CU_TARGET_DIMS);
effects[i]->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); effects[i]->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS);
effects[i]->add_uniform("QuadDims", uniform::UT_VEC2, uniform::CU_QUAD_DIMS); effects[i]->add_uniform("QuadDims", uniform::UT_VEC2, uniform::CU_QUAD_DIMS);
@ -1438,7 +1439,6 @@ int shaders::downsample_pass(d3d_render_target *rt, int source_index, poly_info
for (int bloom_index = 0; bloom_index < rt->bloom_count; bloom_index++) for (int bloom_index = 0; bloom_index < rt->bloom_count; bloom_index++)
{ {
curr_effect->set_vector("TargetDims", 2, rt->bloom_dims[bloom_index]); curr_effect->set_vector("TargetDims", 2, rt->bloom_dims[bloom_index]);
curr_effect->set_int("BloomLevel", bloom_index + 1);
curr_effect->set_texture("DiffuseTexture", curr_effect->set_texture("DiffuseTexture",
bloom_index == 0 bloom_index == 0
? rt->source_texture[next_index] ? rt->source_texture[next_index]
@ -1824,6 +1824,9 @@ d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_i
? static_cast<int>(prim->get_quad_width() + 0.5f) ? static_cast<int>(prim->get_quad_width() + 0.5f)
: static_cast<int>(prim->get_quad_height() + 0.5f); : static_cast<int>(prim->get_quad_height() + 0.5f);
target_width *= oversampling_enable ? 2 : 1;
target_height *= oversampling_enable ? 2 : 1;
// find render target and check if the size of the target quad has changed // find render target and check if the size of the target quad has changed
d3d_render_target *target = find_render_target(texture); d3d_render_target *target = find_render_target(texture);
if (target != nullptr && target->target_width == target_width && target->target_height == target_height) if (target != nullptr && target->target_width == target_width && target->target_height == target_height)
@ -1846,6 +1849,9 @@ d3d_render_target* shaders::get_vector_target(render_primitive *prim)
int target_width = static_cast<int>(prim->get_quad_width() + 0.5f); int target_width = static_cast<int>(prim->get_quad_width() + 0.5f);
int target_height = static_cast<int>(prim->get_quad_height() + 0.5f); int target_height = static_cast<int>(prim->get_quad_height() + 0.5f);
target_width *= oversampling_enable ? 2 : 1;
target_height *= oversampling_enable ? 2 : 1;
// find render target and check of the size of the target quad has changed // find render target and check of the size of the target quad has changed
d3d_render_target *target = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); d3d_render_target *target = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
if (target != nullptr && target->target_width == target_width && target->target_height == target_height) if (target != nullptr && target->target_width == target_width && target->target_height == target_height)
@ -1863,7 +1869,10 @@ void shaders::create_vector_target(render_primitive *prim)
int target_width = static_cast<int>(prim->get_quad_width() + 0.5f); int target_width = static_cast<int>(prim->get_quad_width() + 0.5f);
int target_height = static_cast<int>(prim->get_quad_height() + 0.5f); int target_height = static_cast<int>(prim->get_quad_height() + 0.5f);
osd_printf_verbose("create_vector_target() - %f, %f; %d, %d\n", prim->get_quad_width(), prim->get_quad_height(), (int)(prim->get_quad_width() + 0.5f), (int)(prim->get_quad_height() + 0.5f)); target_width *= oversampling_enable ? 2 : 1;
target_height *= oversampling_enable ? 2 : 1;
osd_printf_verbose("create_vector_target() - %d, %d\n", target_width, target_height);
if (!add_render_target(d3d, nullptr, d3d->get_width(), d3d->get_height(), target_width, target_height)) if (!add_render_target(d3d, nullptr, d3d->get_width(), d3d->get_height(), target_width, target_height))
{ {
vector_enable = false; vector_enable = false;
@ -1970,7 +1979,10 @@ bool shaders::register_texture(render_primitive *prim, texture_info *texture)
? static_cast<int>(prim->get_quad_width() + 0.5f) ? static_cast<int>(prim->get_quad_width() + 0.5f)
: static_cast<int>(prim->get_quad_height() + 0.5f); : static_cast<int>(prim->get_quad_height() + 0.5f);
osd_printf_verbose("register_texture() - %f, %f; %d, %d\n", prim->get_quad_width(), prim->get_quad_height(), (int)(prim->get_quad_width() + 0.5f), (int)(prim->get_quad_height() + 0.5f)); target_width *= oversampling_enable ? 2 : 1;
target_height *= oversampling_enable ? 2 : 1;
osd_printf_verbose("register_texture() - %d, %d\n", target_width, target_height);
if (!add_render_target(d3d, texture, texture->get_width(), texture->get_height(), target_width, target_height)) if (!add_render_target(d3d, texture, texture->get_width(), texture->get_height(), target_width, target_height))
{ {
return false; return false;
@ -2605,35 +2617,16 @@ void uniform::update()
} }
case CU_SOURCE_DIMS: case CU_SOURCE_DIMS:
{ {
if (shadersys->curr_texture != nullptr) if (shadersys->curr_texture)
{ {
vec2f sourcedims = shadersys->curr_texture->get_rawdims(); vec2f sourcedims = shadersys->curr_texture->get_rawdims();
m_shader->set_vector("SourceDims", 2, &sourcedims.c.x); m_shader->set_vector("SourceDims", 2, &sourcedims.c.x);
} }
else
{
vec2f sourcedims = d3d->get_dims();
m_shader->set_vector("SourceDims", 2, &sourcedims.c.x);
}
break;
}
case CU_SOURCE_RECT:
{
if (shadersys->curr_texture != nullptr)
{
vec2f delta = shadersys->curr_texture->get_uvstop() - shadersys->curr_texture->get_uvstart();
m_shader->set_vector("SourceRect", 2, &delta.c.x);
}
else
{
float delta[2] = { 1.0f, 1.0f };
m_shader->set_vector("SourceRect", 2, delta);
}
break; break;
} }
case CU_TARGET_DIMS: case CU_TARGET_DIMS:
{ {
if (shadersys->curr_render_target != nullptr) if (shadersys->curr_render_target)
{ {
float targetdims[2] = { float targetdims[2] = {
static_cast<float>(shadersys->curr_render_target->target_width), static_cast<float>(shadersys->curr_render_target->target_width),
@ -2644,7 +2637,7 @@ void uniform::update()
} }
case CU_QUAD_DIMS: case CU_QUAD_DIMS:
{ {
if (shadersys->curr_poly != nullptr) if (shadersys->curr_poly)
{ {
float quaddims[2] = { float quaddims[2] = {
// round // round

View File

@ -45,7 +45,6 @@ public:
{ {
CU_SCREEN_DIMS = 0, CU_SCREEN_DIMS = 0,
CU_SOURCE_DIMS, CU_SOURCE_DIMS,
CU_SOURCE_RECT,
CU_TARGET_DIMS, CU_TARGET_DIMS,
CU_QUAD_DIMS, CU_QUAD_DIMS,
@ -384,6 +383,7 @@ private:
bool master_enable; // overall enable flag bool master_enable; // overall enable flag
bool vector_enable; // vector post-processing enable flag bool vector_enable; // vector post-processing enable flag
bool oversampling_enable; // oversampling enable flag
bool paused; // whether or not rendering is currently paused bool paused; // whether or not rendering is currently paused
int num_screens; // number of emulated physical screens int num_screens; // number of emulated physical screens
int curr_screen; // current screen for render target operations int curr_screen; // current screen for render target operations

View File

@ -277,8 +277,9 @@ const options_entry windows_options::s_option_entries[] =
// post-processing options // post-processing options
{ nullptr, nullptr, OPTION_HEADER, "DIRECT3D POST-PROCESSING OPTIONS" }, { nullptr, nullptr, OPTION_HEADER, "DIRECT3D POST-PROCESSING OPTIONS" },
{ WINOPTION_HLSL_ENABLE";hlsl", "0", OPTION_BOOLEAN, "enables HLSL post-processing (PS3.0 required)" },
{ WINOPTION_HLSLPATH, "hlsl", OPTION_STRING, "path to hlsl files" }, { WINOPTION_HLSLPATH, "hlsl", OPTION_STRING, "path to hlsl files" },
{ WINOPTION_HLSL_ENABLE";hlsl", "0", OPTION_BOOLEAN, "enables HLSL post-processing (PS3.0 required)" },
{ WINOPTION_HLSL_OVERSAMPLING, "0", OPTION_BOOLEAN, "enables HLSL oversampling" },
{ WINOPTION_HLSL_WRITE, nullptr, OPTION_STRING, "enables HLSL AVI writing (huge disk bandwidth suggested)" }, { WINOPTION_HLSL_WRITE, nullptr, OPTION_STRING, "enables HLSL AVI writing (huge disk bandwidth suggested)" },
{ WINOPTION_HLSL_SNAP_WIDTH, "2048", OPTION_STRING, "HLSL upscaled-snapshot width" }, { WINOPTION_HLSL_SNAP_WIDTH, "2048", OPTION_STRING, "HLSL upscaled-snapshot width" },
{ WINOPTION_HLSL_SNAP_HEIGHT, "1536", OPTION_STRING, "HLSL upscaled-snapshot height" }, { WINOPTION_HLSL_SNAP_HEIGHT, "1536", OPTION_STRING, "HLSL upscaled-snapshot height" },

View File

@ -26,8 +26,9 @@
#define WINOPTION_MENU "menu" #define WINOPTION_MENU "menu"
// core post-processing options // core post-processing options
#define WINOPTION_HLSL_ENABLE "hlsl_enable"
#define WINOPTION_HLSLPATH "hlslpath" #define WINOPTION_HLSLPATH "hlslpath"
#define WINOPTION_HLSL_ENABLE "hlsl_enable"
#define WINOPTION_HLSL_OVERSAMPLING "hlsl_oversampling"
#define WINOPTION_HLSL_WRITE "hlsl_write" #define WINOPTION_HLSL_WRITE "hlsl_write"
#define WINOPTION_HLSL_SNAP_WIDTH "hlsl_snap_width" #define WINOPTION_HLSL_SNAP_WIDTH "hlsl_snap_width"
#define WINOPTION_HLSL_SNAP_HEIGHT "hlsl_snap_height" #define WINOPTION_HLSL_SNAP_HEIGHT "hlsl_snap_height"
@ -128,6 +129,7 @@ public:
// core post-processing options // core post-processing options
const char *screen_post_fx_dir() const { return value(WINOPTION_HLSLPATH); } const char *screen_post_fx_dir() const { return value(WINOPTION_HLSLPATH); }
bool d3d_hlsl_enable() const { return bool_value(WINOPTION_HLSL_ENABLE); } bool d3d_hlsl_enable() const { return bool_value(WINOPTION_HLSL_ENABLE); }
bool d3d_hlsl_oversampling() const { return bool_value(WINOPTION_HLSL_OVERSAMPLING); }
const char *d3d_hlsl_write() const { return value(WINOPTION_HLSL_WRITE); } const char *d3d_hlsl_write() const { return value(WINOPTION_HLSL_WRITE); }
int d3d_snap_width() const { return int_value(WINOPTION_HLSL_SNAP_WIDTH); } int d3d_snap_width() const { return int_value(WINOPTION_HLSL_SNAP_WIDTH); }
int d3d_snap_height() const { return int_value(WINOPTION_HLSL_SNAP_HEIGHT); } int d3d_snap_height() const { return int_value(WINOPTION_HLSL_SNAP_HEIGHT); }