UE4/5 风格化材质---描边部分HLSL代码分享

视频指路:[UE4/UE5]水墨(彩墨)风格化材质制作流程分享 (bilibili.com)
此文章为该视频内使用的部分代码
//-----边缘检测算法-----
//首行填充函数
return 0;}
//--------//
#ifndef _LAPLACETRANSFROM_
#define _LAPLACETRANSFROM_
float GetPixelDepth(FMaterialPixelParameters _Parameters,float2 Offset,float DilationRate){
float2 uv=GetDefaultSceneTextureUV(_Parameters,14);
Offset*=ViewportUVToBufferUV(View.ViewSizeAndInvSize.zw);
float2 newUV=uv+Offset*DilationRate;
return SceneTextureLookup(newUV,1,false);
}
float LaplaceTransform(FMaterialPixelParameters _Parameters,float Thickness){
float3x3 LaplaceMat={0,1,0,
1,-4,1,
0,1,0};
float OutDepth=0.0;
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
float2 offset=float2(i-1.0,j-1.0);
float temp=GetPixelDepth(_Parameters,offset,Thickness)*LaplaceMat[i][j];
OutDepth+=temp;
}
}
return abs(OutDepth);
}
#endif //#ifndef _LAPLACETRANSFROM_
//--------//
//末行填充函数
void FixFunc(){
//------描边
float OutlineFunction(){
float OutDepth=LaplaceTransform(Parameters,Thickness);
float Outline=1-saturate(1/OutDepth);
float CustomDepth=SceneTextureLookup(GetDefaultSceneTextureUV(Parameters,14),13,false).r;
float SceneDepth=SceneTextureLookup(GetDefaultSceneTextureUV(Parameters,14),1,false).r;
Outline=lerp(Outline,0,step(CustomDepth,SceneDepth));
Outline*=step(Threshold,OutDepth);
return Outline;
}
//-----扰乱描边
float DisturbThicknessWithDepth(float Noise,float Thickness,float SceneDepth){
Noise=(Noise-0.5)*Thickness;
Thickness=(Thickness+Noise)*SceneDepth;
return Thickness;
}