largely based on work by @rextimmy: add premultiplied alpha

This commit is contained in:
AzaezelX 2019-11-22 10:02:01 -06:00
parent c1e99364b7
commit bd21a207ef
6 changed files with 37 additions and 11 deletions

View file

@ -82,6 +82,7 @@ ImplementEnumType( MaterialBlendOp,
"@ingroup GFX\n\n") "@ingroup GFX\n\n")
{ Material::None, "None", "Disable blending for this material." }, { Material::None, "None", "Disable blending for this material." },
{ Material::Mul, "Mul", "Multiplicative blending." }, { 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::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::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." }, { Material::Sub, "Sub", "Subtractive Blending. Reverses the color model, causing dark colors to have a stronger visual effect." },

View file

@ -106,6 +106,7 @@ public:
{ {
None = 0, None = 0,
Mul, Mul,
PreMul,
Add, Add,
AddAlpha, // add modulated with alpha channel AddAlpha, // add modulated with alpha channel
Sub, Sub,

View file

@ -128,6 +128,12 @@ void ProcessedMaterial::_setBlendState(Material::BlendOp blendOp, GFXStateBlockD
desc.blendDest = GFXBlendInvSrcAlpha; desc.blendDest = GFXBlendInvSrcAlpha;
break; break;
} }
case Material::PreMul:
{
desc.blendSrc = GFXBlendOne;
desc.blendDest = GFXBlendInvSrcAlpha;
break;
}
case Material::LerpAlpha: case Material::LerpAlpha:
{ {
desc.blendSrc = GFXBlendSrcAlpha; desc.blendSrc = GFXBlendSrcAlpha;

View file

@ -115,6 +115,10 @@ LangElement* ShaderFeatureGLSL::assignColor( LangElement *elem,
assign = new GenOp( "@ *= @", color, elem ); assign = new GenOp( "@ *= @", color, elem );
break; break;
case Material::PreMul:
assign = new GenOp("@.rgb = @.rgb + (@.rgb*(1.0-@.a))", color, elem, color, elem);
break;
case Material::AddAlpha: case Material::AddAlpha:
assign = new GenOp( "@ += @ * @.a", color, elem, elem ); assign = new GenOp( "@ += @ * @.a", color, elem, elem );
break; break;

View file

@ -115,6 +115,10 @@ LangElement* ShaderFeatureHLSL::assignColor( LangElement *elem,
assign = new GenOp( "@ *= @", color, elem ); assign = new GenOp( "@ *= @", color, elem );
break; break;
case Material::PreMul:
assign = new GenOp("@.rgb = @.rgb + (@.rgb*(1.0-@.a))", color, elem, color, elem);
break;
case Material::AddAlpha: case Material::AddAlpha:
assign = new GenOp( "@ += @ * @.a", color, elem, elem ); assign = new GenOp( "@ += @ * @.a", color, elem, elem );
break; break;

View file

@ -74,11 +74,12 @@ function MaterialEditorGui::open(%this)
//Blending Modes //Blending Modes
MaterialEditorPropertiesWindow-->blendingTypePopUp.clear(); MaterialEditorPropertiesWindow-->blendingTypePopUp.clear();
MaterialEditorPropertiesWindow-->blendingTypePopUp.add(None,0); MaterialEditorPropertiesWindow-->blendingTypePopUp.add(None,0);
MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Mul,1); MaterialEditorPropertiesWindow-->blendingTypePopUp.add(preMul,1);
MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Add,2); MaterialEditorPropertiesWindow-->blendingTypePopUp.add(LerpAlpha,2);
MaterialEditorPropertiesWindow-->blendingTypePopUp.add(AddAlpha,3); MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Mul,3);
MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Sub,4); MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Add,4);
MaterialEditorPropertiesWindow-->blendingTypePopUp.add(LerpAlpha,5); MaterialEditorPropertiesWindow-->blendingTypePopUp.add(AddAlpha,5);
MaterialEditorPropertiesWindow-->blendingTypePopUp.add(Sub,6);
MaterialEditorPropertiesWindow-->blendingTypePopUp.setSelected( 0, false ); MaterialEditorPropertiesWindow-->blendingTypePopUp.setSelected( 0, false );
//Reflection Types //Reflection Types
@ -777,15 +778,24 @@ function MaterialEditorGui::guiSync( %this, %material )
MaterialEditorPropertiesWindow-->castShadows.setValue((%material).castShadows); MaterialEditorPropertiesWindow-->castShadows.setValue((%material).castShadows);
MaterialEditorPropertiesWindow-->castDynamicShadows.setValue((%material).castDynamicShadows); MaterialEditorPropertiesWindow-->castDynamicShadows.setValue((%material).castDynamicShadows);
MaterialEditorPropertiesWindow-->translucentCheckbox.setValue((%material).translucent); 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) switch$((%material).translucentBlendOp)
{ {
case "None": %selectedNum = 0; case "None": %selectedNum = 0;
case "Mul": %selectedNum = 1; case "preMul": %selectedNum = 1;
case "Add": %selectedNum = 2; case "LerpAlpha": %selectedNum = 2;
case "AddAlpha": %selectedNum = 3; case "Mul": %selectedNum = 3;
case "Sub": %selectedNum = 4; case "": %selectedNum = 4;
case "LerpAlpha": %selectedNum = 5; case "AddAlpha": %selectedNum = 5;
case "Sub": %selectedNum = 6;
} }
MaterialEditorPropertiesWindow-->blendingTypePopUp.setSelected(%selectedNum); MaterialEditorPropertiesWindow-->blendingTypePopUp.setSelected(%selectedNum);