hwr2: separate Modulate and Alpha blending in 2d

This commit is contained in:
Eidolon 2023-03-01 18:54:31 -06:00
parent 35ae8f01f4
commit df5f24e5c7
3 changed files with 21 additions and 8 deletions

View file

@ -287,7 +287,7 @@ static PipelineDesc make_pipeline_desc(TwodeePipelineKey key)
BlendDesc blend_desc;
switch (key.blend)
{
case Draw2dBlend::kModulate:
case Draw2dBlend::kAlphaTransparent:
blend_desc.source_factor_color = BlendFactor::kSourceAlpha;
blend_desc.dest_factor_color = BlendFactor::kOneMinusSourceAlpha;
blend_desc.color_function = BlendFunction::kAdd;
@ -295,6 +295,14 @@ static PipelineDesc make_pipeline_desc(TwodeePipelineKey key)
blend_desc.dest_factor_alpha = BlendFactor::kOneMinusSourceAlpha;
blend_desc.alpha_function = BlendFunction::kAdd;
break;
case Draw2dBlend::kModulate:
blend_desc.source_factor_color = BlendFactor::kDest;
blend_desc.dest_factor_color = BlendFactor::kZero;
blend_desc.color_function = BlendFunction::kAdd;
blend_desc.source_factor_alpha = BlendFactor::kDestAlpha;
blend_desc.dest_factor_alpha = BlendFactor::kZero;
blend_desc.alpha_function = BlendFunction::kAdd;
break;
case Draw2dBlend::kAdditive:
blend_desc.source_factor_color = BlendFactor::kSourceAlpha;
blend_desc.dest_factor_color = BlendFactor::kOne;
@ -454,21 +462,25 @@ void TwodeePass::prepass(Rhi& rhi)
if (data_->pipelines.size() == 0)
{
TwodeePipelineKey alpha_transparent_tris = {Draw2dBlend::kAlphaTransparent, false};
TwodeePipelineKey modulate_tris = {Draw2dBlend::kModulate, false};
TwodeePipelineKey additive_tris = {Draw2dBlend::kAdditive, false};
TwodeePipelineKey subtractive_tris = {Draw2dBlend::kSubtractive, false};
TwodeePipelineKey revsubtractive_tris = {Draw2dBlend::kReverseSubtractive, false};
TwodeePipelineKey invertdest_tris = {Draw2dBlend::kInvertDest, false};
TwodeePipelineKey alpha_transparent_lines = {Draw2dBlend::kAlphaTransparent, true};
TwodeePipelineKey modulate_lines = {Draw2dBlend::kModulate, true};
TwodeePipelineKey additive_lines = {Draw2dBlend::kAdditive, true};
TwodeePipelineKey subtractive_lines = {Draw2dBlend::kSubtractive, true};
TwodeePipelineKey revsubtractive_lines = {Draw2dBlend::kReverseSubtractive, true};
TwodeePipelineKey invertdest_lines = {Draw2dBlend::kInvertDest, true};
data_->pipelines.insert({alpha_transparent_tris, rhi.create_pipeline(make_pipeline_desc(alpha_transparent_tris))});
data_->pipelines.insert({modulate_tris, rhi.create_pipeline(make_pipeline_desc(modulate_tris))});
data_->pipelines.insert({additive_tris, rhi.create_pipeline(make_pipeline_desc(additive_tris))});
data_->pipelines.insert({subtractive_tris, rhi.create_pipeline(make_pipeline_desc(subtractive_tris))});
data_->pipelines.insert({revsubtractive_tris, rhi.create_pipeline(make_pipeline_desc(revsubtractive_tris))});
data_->pipelines.insert({invertdest_tris, rhi.create_pipeline(make_pipeline_desc(invertdest_tris))});
data_->pipelines.insert({alpha_transparent_lines, rhi.create_pipeline(make_pipeline_desc(alpha_transparent_lines))});
data_->pipelines.insert({modulate_lines, rhi.create_pipeline(make_pipeline_desc(modulate_lines))});
data_->pipelines.insert({additive_lines, rhi.create_pipeline(make_pipeline_desc(additive_lines))});
data_->pipelines.insert({subtractive_lines, rhi.create_pipeline(make_pipeline_desc(subtractive_lines))});

View file

@ -40,6 +40,7 @@ struct TwodeeVertex
enum class Draw2dBlend
{
kAlphaTransparent,
kModulate,
kAdditive,
kSubtractive,
@ -80,7 +81,7 @@ struct Draw2dVertices
std::size_t begin_index = 0;
std::size_t begin_element = 0;
std::size_t elements = 0;
Draw2dBlend blend = Draw2dBlend::kModulate;
Draw2dBlend blend = Draw2dBlend::kAlphaTransparent;
lumpnum_t flat_lump = UINT32_MAX; // LUMPERROR but not loading w_wad.h from this header
bool lines = false;
};

View file

@ -914,7 +914,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca
{
falpha = (10 - alphalevel) / 10.f;
}
hwr2::Draw2dBlend blend = hwr2::Draw2dBlend::kModulate;
hwr2::Draw2dBlend blend = hwr2::Draw2dBlend::kAlphaTransparent;
switch (blendmode)
{
case AST_MODULATE:
@ -934,7 +934,7 @@ void V_DrawStretchyFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, fixed_t vsca
blend = hwr2::Draw2dBlend::kSubtractive;
break;
default:
blend = hwr2::Draw2dBlend::kModulate;
blend = hwr2::Draw2dBlend::kAlphaTransparent;
break;
}
@ -1187,7 +1187,7 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
float a = 0.5f; // alphalevel is unused in GL??
g_2d.begin_quad()
.rect(x, y, w, h)
.blend(hwr2::Draw2dBlend::kModulate)
.blend(hwr2::Draw2dBlend::kAlphaTransparent)
.color(r, g, b, a)
.done();
}
@ -1356,7 +1356,7 @@ void V_DrawFadeFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c, UINT16 color, U
g = bc.green / 255.f;
b = bc.blue / 255.f;
a = softwaretranstohwr[std::clamp(static_cast<int>(strength), 0, 10)] / 255.f;
blendmode = hwr2::Draw2dBlend::kModulate;
blendmode = hwr2::Draw2dBlend::kAlphaTransparent;
}
g_2d.begin_quad()
@ -1553,7 +1553,7 @@ void V_DrawFadeScreen(UINT16 color, UINT8 strength)
g = bc.green / 255.f;
b = bc.blue / 255.f;
a = softwaretranstohwr[std::clamp(static_cast<int>(strength), 0, 10)] / 255.f;
blendmode = hwr2::Draw2dBlend::kModulate;
blendmode = hwr2::Draw2dBlend::kAlphaTransparent;
}
g_2d.begin_quad()
@ -1629,7 +1629,7 @@ void V_DrawFadeConsBack(INT32 plines)
float a = 0.5f;
g_2d.begin_quad()
.rect(0, 0, vid.width, plines)
.blend(hwr2::Draw2dBlend::kModulate)
.blend(hwr2::Draw2dBlend::kAlphaTransparent)
.color(r, g, b, a)
.done();
}