So I’ve probably wasted 20 hours now trying to wrap my head around custom expressions, material functions and some other advanced material topics. What I have been trying to do, is port or emulate some basic shaders. Particularly various noise generators, atmospheric scattering, whatever has my eye really… Problem is, not one lick of HLSL code has worked that didn’t require a fine-toothed comb. I can only assume I am missing something that will blow the lid off of this feature of UE for me, or it just really isn’t worth my time. For example, this code won’t work as is:
float4 grad4(float j, float4 ip)
{
const float4 ones = float4(1.0, 1.0, 1.0, -1.0);
float4 p, s;
p.xyz = floor( frac(j * ip.xyz) * 7.0) * ip.z - 1.0;
p.w = 1.5 - dot( abs(p.xyz), ones.xyz );
p.xyz -= sign(p.xyz) * (1 - step(p.y, p.x));
return p;
}
I haven’t a clue how to modify it to work. Engine says (like a broken record the last day): Error [SM5] error X3000: syntax error: unexpected token ‘(’. I ran into this previously and it appears we can only do a single simple function per custom expression. I have yet to figure out how to reference custom expressions from other custom expressions. I have managed to “convert” a couple of simple HLSL snippets, such as this:
#define NOISE_SIMPLEX_1_DIV_289 0.00346020761245674740484429065744f
float mod289(float x) {
return x - floor(x * NOISE_SIMPLEX_1_DIV_289) * 289.0;
}
into this:
#define NOISE_SIMPLEX_1_DIV_289 0.00346020761245674740484429065744f
float mod289 = float(x);
return x - floor(x * NOISE_SIMPLEX_1_DIV_289) * 289.0;
Now, that snippet was simple enough to make into a material function:
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_415"
Begin Object Class=EdGraphPin Name="EdGraphPin_3559"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3558"
End Object
Begin Object Class=MaterialExpressionFunctionOutput Name="MaterialExpressionFunctionOutput_6"
End Object
Begin Object Name="EdGraphPin_3559"
PinName="Output"
PinFriendlyName=" "
Direction=EGPD_Output
End Object
Begin Object Name="EdGraphPin_3558"
PinName="Input"
PinFriendlyName=" "
PinType=(PinCategory="required")
LinkedTo(0)=EdGraphPin'MaterialGraphNode_417.EdGraphPin_3564'
End Object
Begin Object Name="MaterialExpressionFunctionOutput_6"
A=(Expression=MaterialExpressionSubtract'MaterialGraphNode_417.MaterialExpressionSubtract_19')
bLastPreviewed=True
Id=F780BEED47319A28037711B52F5E5428
MaterialExpressionEditorX=384
MaterialExpressionEditorY=336
MaterialExpressionGuid=7F267A844D68C7902E3A75AE97E7B630
Material=Material'/Engine/Transient.Material_94'
End Object
MaterialExpression=MaterialExpressionFunctionOutput'MaterialExpressionFunctionOutput_6'
Pins(0)=EdGraphPin'EdGraphPin_3558'
Pins(1)=EdGraphPin'EdGraphPin_3559'
NodePosX=384
NodePosY=336
NodeGuid=4A0432B843E1F17F54F8CD857021D567
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_416"
Begin Object Class=EdGraphPin Name="EdGraphPin_3561"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3560"
End Object
Begin Object Class=MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_17"
End Object
Begin Object Name="EdGraphPin_3561"
PinName="Output"
PinFriendlyName=" "
Direction=EGPD_Output
LinkedTo(0)=EdGraphPin'MaterialGraphNode_417.EdGraphPin_3562'
LinkedTo(1)=EdGraphPin'MaterialGraphNode_419.EdGraphPin_3567'
End Object
Begin Object Name="EdGraphPin_3560"
PinName="Preview"
PinType=(PinCategory="optional")
End Object
Begin Object Name="MaterialExpressionFunctionInput_17"
InputName="x"
Id=05726F994A29548D41FA9FB878F75DFE
InputType=FunctionInput_Scalar
MaterialExpressionEditorX=-384
MaterialExpressionEditorY=368
MaterialExpressionGuid=0FAADE414142C61E743EE7AF1BD34B04
Material=Material'/Engine/Transient.Material_94'
End Object
MaterialExpression=MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_17'
Pins(0)=EdGraphPin'EdGraphPin_3560'
Pins(1)=EdGraphPin'EdGraphPin_3561'
NodePosX=-384
NodePosY=368
NodeGuid=D7E637C94B662747F01E409882EBC22C
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_417"
Begin Object Class=EdGraphPin Name="EdGraphPin_3564"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3563"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3562"
End Object
Begin Object Class=MaterialExpressionSubtract Name="MaterialExpressionSubtract_19"
End Object
Begin Object Name="EdGraphPin_3564"
PinName="Output"
PinFriendlyName=" "
Direction=EGPD_Output
LinkedTo(0)=EdGraphPin'MaterialGraphNode_415.EdGraphPin_3558'
End Object
Begin Object Name="EdGraphPin_3563"
PinName="B"
PinType=(PinCategory="optional")
LinkedTo(0)=EdGraphPin'MaterialGraphNode_418.EdGraphPin_3566'
End Object
Begin Object Name="EdGraphPin_3562"
PinName="A"
PinType=(PinCategory="optional")
LinkedTo(0)=EdGraphPin'MaterialGraphNode_416.EdGraphPin_3561'
End Object
Begin Object Name="MaterialExpressionSubtract_19"
A=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_416.MaterialExpressionFunctionInput_17')
B=(Expression=MaterialExpressionFloor'MaterialGraphNode_418.MaterialExpressionFloor_5')
MaterialExpressionEditorX=256
MaterialExpressionEditorY=368
MaterialExpressionGuid=7D08791648538EC2EE466B81C93BC530
Material=Material'/Engine/Transient.Material_94'
End Object
MaterialExpression=MaterialExpressionSubtract'MaterialExpressionSubtract_19'
Pins(0)=EdGraphPin'EdGraphPin_3562'
Pins(1)=EdGraphPin'EdGraphPin_3563'
Pins(2)=EdGraphPin'EdGraphPin_3564'
NodePosX=256
NodePosY=368
NodeGuid=31E0DF3B4B35E8C5626DFFB63E228934
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_418"
Begin Object Class=EdGraphPin Name="EdGraphPin_3566"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3565"
End Object
Begin Object Class=MaterialExpressionFloor Name="MaterialExpressionFloor_5"
End Object
Begin Object Name="EdGraphPin_3566"
PinName="Output"
PinFriendlyName=" "
Direction=EGPD_Output
LinkedTo(0)=EdGraphPin'MaterialGraphNode_417.EdGraphPin_3563'
End Object
Begin Object Name="EdGraphPin_3565"
PinName="Input"
PinFriendlyName=" "
PinType=(PinCategory="required")
LinkedTo(0)=EdGraphPin'MaterialGraphNode_420.EdGraphPin_3572'
End Object
Begin Object Name="MaterialExpressionFloor_5"
Input=(Expression=MaterialExpressionMultiply'MaterialGraphNode_420.MaterialExpressionMultiply_46')
MaterialExpressionEditorX=144
MaterialExpressionEditorY=448
MaterialExpressionGuid=350A5DE5473382AEF9412682E9C765CC
Material=Material'/Engine/Transient.Material_94'
End Object
MaterialExpression=MaterialExpressionFloor'MaterialExpressionFloor_5'
Pins(0)=EdGraphPin'EdGraphPin_3565'
Pins(1)=EdGraphPin'EdGraphPin_3566'
NodePosX=144
NodePosY=448
NodeGuid=2A8808D04B8CDDB3EE473BA73F8B0359
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_419"
Begin Object Class=EdGraphPin Name="EdGraphPin_3569"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3568"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3567"
End Object
Begin Object Class=MaterialExpressionMultiply Name="MaterialExpressionMultiply_45"
End Object
Begin Object Name="EdGraphPin_3569"
PinName="Output"
PinFriendlyName=" "
Direction=EGPD_Output
LinkedTo(0)=EdGraphPin'MaterialGraphNode_420.EdGraphPin_3570'
End Object
Begin Object Name="EdGraphPin_3568"
PinName="B"
PinType=(PinCategory="optional")
End Object
Begin Object Name="EdGraphPin_3567"
PinName="A"
PinType=(PinCategory="optional")
LinkedTo(0)=EdGraphPin'MaterialGraphNode_416.EdGraphPin_3561'
End Object
Begin Object Name="MaterialExpressionMultiply_45"
A=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_416.MaterialExpressionFunctionInput_17')
ConstB=0.003460
MaterialExpressionEditorX=-192
MaterialExpressionEditorY=448
MaterialExpressionGuid=0A3F0EAE4DB5830EB7B5CBB7E9369E8E
Material=Material'/Engine/Transient.Material_94'
End Object
MaterialExpression=MaterialExpressionMultiply'MaterialExpressionMultiply_45'
Pins(0)=EdGraphPin'EdGraphPin_3567'
Pins(1)=EdGraphPin'EdGraphPin_3568'
Pins(2)=EdGraphPin'EdGraphPin_3569'
NodePosX=-192
NodePosY=448
NodeGuid=D7B0C6394A887811A6DEF585E3ABC3A1
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_420"
Begin Object Class=EdGraphPin Name="EdGraphPin_3572"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3571"
End Object
Begin Object Class=EdGraphPin Name="EdGraphPin_3570"
End Object
Begin Object Class=MaterialExpressionMultiply Name="MaterialExpressionMultiply_46"
End Object
Begin Object Name="EdGraphPin_3572"
PinName="Output"
PinFriendlyName=" "
Direction=EGPD_Output
LinkedTo(0)=EdGraphPin'MaterialGraphNode_418.EdGraphPin_3565'
End Object
Begin Object Name="EdGraphPin_3571"
PinName="B"
PinType=(PinCategory="optional")
End Object
Begin Object Name="EdGraphPin_3570"
PinName="A"
PinType=(PinCategory="optional")
LinkedTo(0)=EdGraphPin'MaterialGraphNode_419.EdGraphPin_3569'
End Object
Begin Object Name="MaterialExpressionMultiply_46"
A=(Expression=MaterialExpressionMultiply'MaterialGraphNode_419.MaterialExpressionMultiply_45')
ConstB=289.000000
MaterialExpressionEditorX=-16
MaterialExpressionEditorY=448
MaterialExpressionGuid=B92882FA48784E774FC2689A8EB2387E
Material=Material'/Engine/Transient.Material_94'
End Object
MaterialExpression=MaterialExpressionMultiply'MaterialExpressionMultiply_46'
Pins(0)=EdGraphPin'EdGraphPin_3570'
Pins(1)=EdGraphPin'EdGraphPin_3571'
Pins(2)=EdGraphPin'EdGraphPin_3572'
NodePosX=-16
NodePosY=448
NodeGuid=BDF588FA492C16D04BFA818B4AEDA138
End Object
My inquery is thus: what is the state of HLSL custom expressions? What am I missing here? I have a nice library of snippets I’d like to get working and a resource I’d be more than happy to share with the community once I get it working well enough. I’ve read over several documents, searched and searched, watched an outdated YouTube video and wasted time on an outdated plugin(which I’d love to see updated for 4.10!). Any help is much appreciated!