欢迎光临散文网 会员登陆 & 注册

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

2023-03-01 20:38 作者:虫棍侠  | 我要投稿

视频指路:[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;

}



UE4/5 风格化材质---描边部分HLSL代码分享的评论 (共 条)

分享到微博请遵守国家法律