From bd21a207efb72cf46b4e6d11ae366cce18bf0065 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Fri, 22 Nov 2019 10:02:01 -0600 Subject: [PATCH] largely based on work by @rextimmy: add premultiplied alpha --- .../source/materials/materialDefinition.cpp | 1 + Engine/source/materials/materialDefinition.h | 1 + Engine/source/materials/processedMaterial.cpp | 6 ++++ .../shaderGen/GLSL/shaderFeatureGLSL.cpp | 4 +++ .../shaderGen/HLSL/shaderFeatureHLSL.cpp | 4 +++ .../scripts/materialEditor.ed.cs | 32 ++++++++++++------- 6 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Engine/source/materials/materialDefinition.cpp b/Engine/source/materials/materialDefinition.cpp index 632e26fec..311aec622 100644 --- a/Engine/source/materials/materialDefinition.cpp +++ b/Engine/source/materials/materialDefinition.cpp @@ -82,6 +82,7 @@ ImplementEnumType( MaterialBlendOp, "@ingroup GFX\n\n") { Material::None, "None", "Disable blending for this material." }, { Material::Mul, "Mul", "Multiplicative blending." }, + { Material::PreMul, "PreMul", "Premultiplied alpha." }, { Material::Add, "Add", "Adds the color of the material to the frame buffer with full alpha for each pixel." }, { Material::AddAlpha, "AddAlpha", "The color is modulated by the alpha channel before being added to the frame buffer." }, { Material::Sub, "Sub", "Subtractive Blending. Reverses the color model, causing dark colors to have a stronger visual effect." }, diff --git a/Engine/source/materials/materialDefinition.h b/Engine/source/materials/materialDefinition.h index 346218158..8ca4b1c70 100644 --- a/Engine/source/materials/materialDefinition.h +++ b/Engine/source/materials/materialDefinition.h @@ -106,6 +106,7 @@ public: { None = 0, Mul, + PreMul, Add, AddAlpha, // add modulated with alpha channel Sub, diff --git a/Engine/source/materials/processedMaterial.cpp b/Engine/source/materials/processedMaterial.cpp index 3455257a6..c1063330c 100644 --- a/Engine/source/materials/processedMaterial.cpp +++ b/Engine/source/materials/processedMaterial.cpp @@ -128,6 +128,12 @@ void ProcessedMaterial::_setBlendState(Material::BlendOp blendOp, GFXStateBlockD desc.blendDest = GFXBlendInvSrcAlpha; break; } + case Material::PreMul: + { + desc.blendSrc = GFXBlendOne; + desc.blendDest = GFXBlendInvSrcAlpha; + break; + } case Material::LerpAlpha: { desc.blendSrc = GFXBlendSrcAlpha; diff --git a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp index 946f0dac3..0a296a829 100644 --- a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp +++ b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp @@ -115,6 +115,10 @@ LangElement* ShaderFeatureGLSL::assignColor( LangElement *elem, assign = new GenOp( "@ *= @", color, elem ); break; + case Material::PreMul: + assign = new GenOp("@.rgb = @.rgb + (@.rgb*(1.0-@.a))", color, elem, color, elem); + break; + case Material::AddAlpha: assign = new GenOp( "@ += @ * @.a", color, elem, elem ); break; diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp index 6de962577..cf69f4bb1 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp @@ -115,6 +115,10 @@ LangElement* ShaderFeatureHLSL::assignColor( LangElement *elem, assign = new GenOp( "@ *= @", color, elem ); break; + case Material::PreMul: + assign = new GenOp("@.rgb = @.rgb + (@.rgb*(1.0-@.a))", color, elem, color, elem); + break; + case Material::AddAlpha: assign = new GenOp( "@ += @ * @.a", color, elem, elem ); break; diff --git a/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.cs b/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.cs index ad15af568..86e210cda 100644 --- a/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.cs +++ b/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.cs @@ -74,11 +74,12 @@ function MaterialEditorGui::open(%this) //Blending Modes MaterialEditorPropertiesWindow-->blendingTypePopUp.clear(); MaterialEditorPropertiesWindow-->blendingTypePopUp.add(None,0); - MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Mul,1); - MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Add,2); - MaterialEditorPropertiesWindow-->blendingTypePopUp.add(AddAlpha,3); - MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Sub,4); - MaterialEditorPropertiesWindow-->blendingTypePopUp.add(LerpAlpha,5); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(preMul,1); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(LerpAlpha,2); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Mul,3); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Add,4); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(AddAlpha,5); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Sub,6); MaterialEditorPropertiesWindow-->blendingTypePopUp.setSelected( 0, false ); //Reflection Types @@ -777,15 +778,24 @@ function MaterialEditorGui::guiSync( %this, %material ) MaterialEditorPropertiesWindow-->castShadows.setValue((%material).castShadows); MaterialEditorPropertiesWindow-->castDynamicShadows.setValue((%material).castDynamicShadows); MaterialEditorPropertiesWindow-->translucentCheckbox.setValue((%material).translucent); + /* + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(preMul,1); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(LerpAlpha,2); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Mul,3); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Add,4); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(AddAlpha,5); + MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Sub,6); + */ switch$((%material).translucentBlendOp) { - case "None": %selectedNum = 0; - case "Mul": %selectedNum = 1; - case "Add": %selectedNum = 2; - case "AddAlpha": %selectedNum = 3; - case "Sub": %selectedNum = 4; - case "LerpAlpha": %selectedNum = 5; + case "None": %selectedNum = 0; + case "preMul": %selectedNum = 1; + case "LerpAlpha": %selectedNum = 2; + case "Mul": %selectedNum = 3; + case "": %selectedNum = 4; + case "AddAlpha": %selectedNum = 5; + case "Sub": %selectedNum = 6; } MaterialEditorPropertiesWindow-->blendingTypePopUp.setSelected(%selectedNum);