(update) check out post #3](Custom Stencil: Radial Silhouette Post Process Materiel (HLSL) (PC) (Full code) (4.13) - Rendering - Unreal Engine Forums) for a four color variant
Hello,
I was looking for a simple way to do edge highlighting and I could not find any solid configurable options. I was able to piece together several other sources and create a simple custom post process material to do Radial Silhouettes. I hope you find it useful.
Sample: Object on the right is highlighted using Stencil Silhouette
This is not a complete walk through, you need to be familiar with setting up post processing and rendering to the Stencil Buffer.
For more information check out these links
https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/PostProcessMaterials/PostProcessDemoMaterialOverview/index.html
https://forums.unrealengine.com/showthread.php?57646-Radial-Blur-PostProcess-Material
http://www.michalorzelek.com/blog/tutorial-creating-outline-effect-around-objects/
http://www.tomlooman.com/the-many-uses-of-custom-depth-in-unreal-4/
The shader Material
The Custom Stencil Radial Silhouette HSLS shader node code
static const int ppi0TexIndex = 14;
static const int stencilTexIndex = 24;
const float blendSizeX = invSize.x * blendRadius;
const float blendSizeY = invSize.y * blendRadius;
const float4 stencilOrigin = SceneTextureLookup(UVs, stencilTexIndex, false);
const float4 ppi0 = SceneTextureLookup(UVs, ppi0TexIndex, false);
if(stencilOrigin.r == stencilIndex)
{
return lerp(ppi0, silhouetteV4, stencilAlpha);
}
const float degreeStep = 360.0 / samples;
float total = 0.0;
float radian;
float2 pos, offset;
for(int i = 0; i < samples; i++)
{
radian = radians(degreeStep*i);
offset.x = cos(radian) * blendSizeX;
offset.y = sin(radian) * blendSizeY;
pos = UVs + offset;
total += SceneTextureLookup(pos, stencilTexIndex, false).r == stencilIndex;
}
return lerp(ppi0, silhouetteV4, total/samples);
Direct to Material Editor: Copy and paste directly into your materal editor
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1"
Begin Object Class=MaterialExpressionScreenPosition Name="MaterialExpressionScreenPosition_2"
End Object
Begin Object Name="MaterialExpressionScreenPosition_2"
MaterialExpressionEditorX=-128
MaterialExpressionEditorY=-256
MaterialExpressionGuid=5C76B52C4E8DF7BECC4272A7F495C5A9
Material=PreviewMaterial'/Engine/Transient.TestPpm'
End Object
MaterialExpression=MaterialExpressionScreenPosition'MaterialExpressionScreenPosition_2'
NodePosX=-128
NodePosY=-256
NodeGuid=93706FAA4FA9BFF056CBD093C9DB7DBD
CustomProperties Pin (PinId=E34FF5E64DE7072671F193B8AD53E981,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 8D70DF964314140F2651EDAF141BF6F9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_3"
Begin Object Class=MaterialExpressionSceneTexture Name="MaterialExpressionSceneTexture_6"
End Object
Begin Object Name="MaterialExpressionSceneTexture_6"
SceneTextureId=PPI_CustomStencil
MaterialExpressionEditorX=-128
MaterialExpressionEditorY=-160
MaterialExpressionGuid=10C897A4491077B5EE9886BAB2E7DDE1
Material=PreviewMaterial'/Engine/Transient.TestPpm'
bCollapsed=False
End Object
MaterialExpression=MaterialExpressionSceneTexture'MaterialExpressionSceneTexture_6'
NodePosX=-128
NodePosY=-160
NodeGuid=8D9A7BBE4EE89B93532CB1980FA86093
CustomProperties Pin (PinId=65134ABF442C5131CBDBFF9D1C6F8391,PinName="UVs",PinType.PinCategory="optional",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=D54DD2E141D213AF9F4DF186F6BF824D,PinName="Color",Direction="EGPD_Output",PinType.PinCategory="mask",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=8CDEA4C643DBBB11117E16BEA9B02315,PinName="Size",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=D9B1EDB144D3B0D21CD0F49126883DC6,PinName="InvSize",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 DFB9A95944BD6F12EC46FFA96D4D9087,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_5"
Begin Object Class=MaterialExpressionScalarParameter Name="MaterialExpressionScalarParameter_8"
End Object
Begin Object Name="MaterialExpressionScalarParameter_8"
DefaultValue=100.000000
ParameterName="StencilIndex"
ExpressionGUID=62F53E1B45274E9BA7AAA4A73E20B97A
MaterialExpressionEditorX=-128
MaterialExpressionEditorY=176
MaterialExpressionGuid=A363709E48CFCBA3D2B7178DA834A47E
Material=PreviewMaterial'/Engine/Transient.TestPpm'
End Object
MaterialExpression=MaterialExpressionScalarParameter'MaterialExpressionScalarParameter_8'
NodePosX=-128
NodePosY=176
bCanRenameNode=True
NodeGuid=60108090441B89A8349930B601B1961F
CustomProperties Pin (PinId=8596C9634B11BBE4DB2CDB80521CE194,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 2033BC224B8B7BE51DC23EBAE6EE37C5,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_6"
Begin Object Class=MaterialExpressionConstant4Vector Name="MaterialExpressionConstant4Vector_2"
End Object
Begin Object Name="MaterialExpressionConstant4Vector_2"
Constant=(R=1.000000,G=0.000000,B=0.000000,A=1.000000)
MaterialExpressionEditorX=-128
MaterialExpressionEditorY=336
MaterialExpressionGuid=BA0A78CB4052148B6F9A6E9F093B1F58
Material=PreviewMaterial'/Engine/Transient.TestPpm'
End Object
MaterialExpression=MaterialExpressionConstant4Vector'MaterialExpressionConstant4Vector_2'
NodePosX=-128
NodePosY=336
NodeGuid=7607FBBC4A1896B5215CB3AEA0C84B80
CustomProperties Pin (PinId=B048BF7B498885C0486E71BCA47920B0,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 C01543A64B356E9F808CC6A05F06CA81,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_7"
Begin Object Class=MaterialExpressionScalarParameter Name="MaterialExpressionScalarParameter_9"
End Object
Begin Object Name="MaterialExpressionScalarParameter_9"
DefaultValue=3.000000
ParameterName="BlendRadius"
ExpressionGUID=0772029A416FD2DE16B76584F6BBAA6F
MaterialExpressionEditorX=-128
MaterialExpressionEditorY=96
MaterialExpressionGuid=98CDC6814146989597B0F5B1DC70C7A4
Material=PreviewMaterial'/Engine/Transient.TestPpm'
End Object
MaterialExpression=MaterialExpressionScalarParameter'MaterialExpressionScalarParameter_9'
NodePosX=-128
NodePosY=96
bCanRenameNode=True
NodeGuid=C774EB6546198B677C21B5BA487EBBCE
CustomProperties Pin (PinId=56D8A2C1494A00BB13B9B485BAD1C78D,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 B4B8BEFB420D54734B26159A33C4B4B8,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_8"
Begin Object Class=MaterialExpressionCustom Name="MaterialExpressionCustom_2"
End Object
Begin Object Name="MaterialExpressionCustom_2"
Code="static const int ppi0TexIndex = 14;
static const int stencilTexIndex = 24;
const float blendSizeX = invSize.x * blendRadius;
const float blendSizeY = invSize.y * blendRadius;
const float4 stencilOrigin = SceneTextureLookup(UVs, stencilTexIndex, false);
const float4 ppi0 = SceneTextureLookup(UVs, ppi0TexIndex, false);
if(stencilOrigin.r == stencilIndex)
{
return lerp(ppi0, silhouetteV4, stencilAlpha);
}
const float degreeStep = 360.0 / samples;
float total = 0.0;
float radian;
float2 pos, offset;
for(int i = 0; i < samples; i++)
{
radian = radians(degreeStep*i);
offset.x = cos(radian) * blendSizeX;
offset.y = sin(radian) * blendSizeY;
pos = UVs + offset;
total += SceneTextureLookup(pos, stencilTexIndex, false).r == stencilIndex;
}
return lerp(ppi0, silhouetteV4, total/samples);"
OutputType=CMOT_Float4
Description="CustomStencilRadialSilhouette"
Inputs(0)=(InputName="UVs",Input=(Expression=MaterialExpressionScreenPosition'MaterialGraphNode_1.MaterialExpressionScreenPosition_2'))
Inputs(1)=(InputName="invSize",Input=(Expression=MaterialExpressionSceneTexture'MaterialGraphNode_3.MaterialExpressionSceneTexture_6',OutputIndex=2))
Inputs(2)=(InputName="samples",Input=(Expression=MaterialExpressionScalarParameter'MaterialGraphNode_9.MaterialExpressionScalarParameter_10'))
Inputs(3)=(InputName="blendRadius",Input=(Expression=MaterialExpressionScalarParameter'MaterialGraphNode_7.MaterialExpressionScalarParameter_9'))
Inputs(4)=(InputName="stencilIndex",Input=(Expression=MaterialExpressionScalarParameter'MaterialGraphNode_5.MaterialExpressionScalarParameter_8'))
Inputs(5)=(InputName="stencilAlpha",Input=(Expression=MaterialExpressionScalarParameter'MaterialGraphNode_10.MaterialExpressionScalarParameter_11'))
Inputs(6)=(InputName="silhouetteV4",Input=(Expression=MaterialExpressionConstant4Vector'MaterialGraphNode_6.MaterialExpressionConstant4Vector_2'))
MaterialExpressionEditorX=288
MaterialExpressionEditorY=-128
MaterialExpressionGuid=D486C08F4A1317698346B2BE7917E4C9
Material=PreviewMaterial'/Engine/Transient.TestPpm'
End Object
MaterialExpression=MaterialExpressionCustom'MaterialExpressionCustom_2'
NodePosX=288
NodePosY=-128
NodeGuid=B6182B7B443225B105E3599603146307
CustomProperties Pin (PinId=8D70DF964314140F2651EDAF141BF6F9,PinName="UVs",PinType.PinCategory="required",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_1 E34FF5E64DE7072671F193B8AD53E981,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=DFB9A95944BD6F12EC46FFA96D4D9087,PinName="invSize",PinType.PinCategory="required",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_3 D9B1EDB144D3B0D21CD0F49126883DC6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=3425B77D4CD594EF81B9A1B3AEEAEC69,PinName="samples",PinType.PinCategory="required",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_9 DDE448354B9839D51AEBBB95C3AF5AF9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=B4B8BEFB420D54734B26159A33C4B4B8,PinName="blendRadius",PinType.PinCategory="required",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_7 56D8A2C1494A00BB13B9B485BAD1C78D,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=2033BC224B8B7BE51DC23EBAE6EE37C5,PinName="stencilIndex",PinType.PinCategory="required",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_5 8596C9634B11BBE4DB2CDB80521CE194,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=613F201241378341050197BF419EF430,PinName="stencilAlpha",PinType.PinCategory="required",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_10 0087AF094BEF7F670E6D949EF0FDCE50,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=C01543A64B356E9F808CC6A05F06CA81,PinName="silhouetteV4",PinType.PinCategory="required",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_6 B048BF7B498885C0486E71BCA47920B0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
CustomProperties Pin (PinId=175D7D22431BF99F6A2C47A7FBC1CCE8,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_Root_0 C99220FB4ECC4061072C158A21829577,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_9"
Begin Object Class=MaterialExpressionScalarParameter Name="MaterialExpressionScalarParameter_10"
End Object
Begin Object Name="MaterialExpressionScalarParameter_10"
DefaultValue=8.000000
ParameterName="Samples"
ExpressionGUID=95E26485453052353F9196A693F97E6A
MaterialExpressionEditorX=-128
MaterialExpressionEditorY=16
MaterialExpressionGuid=6F5D3521459E05CB430DA5ABCE11F01D
Material=PreviewMaterial'/Engine/Transient.TestPpm'
End Object
MaterialExpression=MaterialExpressionScalarParameter'MaterialExpressionScalarParameter_10'
NodePosX=-128
NodePosY=16
bCanRenameNode=True
NodeGuid=13BC974D44E34D09D14754A79BB69041
CustomProperties Pin (PinId=DDE448354B9839D51AEBBB95C3AF5AF9,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 3425B77D4CD594EF81B9A1B3AEEAEC69,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_10"
Begin Object Class=MaterialExpressionScalarParameter Name="MaterialExpressionScalarParameter_11"
End Object
Begin Object Name="MaterialExpressionScalarParameter_11"
DefaultValue=0.050000
ParameterName="StencilAlpha"
ExpressionGUID=DFC05E624A85EEC2F1A2AEAD6F2EC82E
MaterialExpressionEditorX=-128
MaterialExpressionEditorY=256
MaterialExpressionGuid=5D62CC3F4D348BEA099000A67CA27D40
Material=PreviewMaterial'/Engine/Transient.TestPpm'
End Object
MaterialExpression=MaterialExpressionScalarParameter'MaterialExpressionScalarParameter_11'
NodePosX=-128
NodePosY=256
bCanRenameNode=True
NodeGuid=2036479F4FDE80074B0A909A6769DDBF
CustomProperties Pin (PinId=0087AF094BEF7F670E6D949EF0FDCE50,PinName="Output",PinFriendlyName=" ",Direction="EGPD_Output",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.bIsArray=False,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(MaterialGraphNode_8 613F201241378341050197BF419EF430,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,)
End Object