Ue4 Shader 使用

(1)

    MSM_ThinTranslucent            UMETA(DisplayName="Thin Translucent"),
    // TODO:My
    MSM_MyShaderAa    UMETA(DisplayName = "My Shader Aa"),
    MSM_MyShaderAb    UMETA(DisplayName = "My Shader Ab"),

(1)

        case MSM_ThinTranslucent:    ShadingModelName = TEXT("MSM_ThinTranslucent"); break;
        // TODO:My
        case MSM_MyShaderAa:    ShadingModelName = TEXT("MSM_MyShaderAa"); break;
        case MSM_MyShaderAb:    ShadingModelName = TEXT("MSM_MyShaderAb"); break;

(1)

        const bool bSingleLayerWaterUsesSimpleShading = (IsSwitchPlatform(InPlatform) || IsVulkanMobileSM5Platform(InPlatform)) && IsForwardShadingEnabled(InPlatform);
        if (ShadingModels.HasShadingModel(MSM_SingleLayerWater) && bSingleLayerWaterUsesSimpleShading)
        {
            OutEnvironment.SetDefine(TEXT("SINGLE_LAYER_WATER_SIMPLE_FORWARD"), TEXT("1"));
        }
        // todo:My
        if (ShadingModels.HasShadingModel(MSM_MyShaderAa))
        {
            OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_MYSHADERAA"), TEXT("1"));
            NumSetMaterials++;
        }
        if (ShadingModels.HasShadingModel(MSM_MyShaderAb))
        {
            OutEnvironment.SetDefine(TEXT("MATERIAL_SHADINGMODEL_MYSHADERAB"), TEXT("1"));
            NumSetMaterials++;
        }

(1)

(1)

    case MP_Metallic:
        CustomPinNames.Add({MSM_Hair, "Scatter"});
        CustomPinNames.Add({ MSM_MyShaderAa, "MetallicMyShaderAa" });
        CustomPinNames.Add({ MSM_MyShaderAb, "MetallicMyShaderAb" });
        return FText::FromString(GetPinNameFromShadingModelField(Material->GetShadingModels(), CustomPinNames, "Metallic"));

(1)

    case MP_Specular:
        return Material->GetShadingModels() == MSM_MyShaderAa ? LOCTEXT("SpecularMyShaderAa", "SpecularMyShaderAa") : LOCTEXT("Specular", "Specular");
    case MP_Roughness:
        return Material->GetShadingModels() == MSM_MyShaderAa ? LOCTEXT("RoughnessMyShaderAa", "RoughnessMyShaderAa") : LOCTEXT("Roughness", "Roughness");

(1)

    case MP_SubsurfaceColor:
        CustomPinNames.Add({MSM_Cloth, "Fuzz Color"});
        CustomPinNames.Add({ MSM_MyShaderAa, "SubsurfaceColorMyShaderAa" });
        CustomPinNames.Add({ MSM_MyShaderAb, "SubsurfaceColorMyShaderAb" });
        return FText::FromString(GetPinNameFromShadingModelField(Material->GetShadingModels(), CustomPinNames, "Subsurface Color"));
    case MP_CustomData0:    
        CustomPinNames.Add({ MSM_ClearCoat, "Clear Coat" });
        CustomPinNames.Add({MSM_Hair, "Backlit"});
        CustomPinNames.Add({MSM_Cloth, "Cloth"});
        CustomPinNames.Add({MSM_Eye, "Iris Mask"});
        CustomPinNames.Add({ MSM_MyShaderAa, "CustomData0MyShaderAa" });
        CustomPinNames.Add({ MSM_MyShaderAb, "CustomData0MyShaderAa" });
        return FText::FromString(GetPinNameFromShadingModelField(Material->GetShadingModels(), CustomPinNames, "Custom Data 0"));

(1)

修改前

#define WRITES_CUSTOMDATA_TO_GBUFFER        (USES_GBUFFER && (MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN || MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE || MATERIAL_SHADINGMODEL_CLEAR_COAT || MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE || MATERIAL_SHADINGMODEL_HAIR || MATERIAL_SHADINGMODEL_CLOTH || MATERIAL_SHADINGMODEL_EYE))

修改后

#define WRITES_CUSTOMDATA_TO_GBUFFER        (USES_GBUFFER && (MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN || MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE || MATERIAL_SHADINGMODEL_CLEAR_COAT || MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE || MATERIAL_SHADINGMODEL_HAIR || MATERIAL_SHADINGMODEL_CLOTH || MATERIAL_SHADINGMODEL_EYE || MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB))

(1)

修改前

#if MATERIAL_SHADINGMODEL_CLOTH
        else if (ShadingModel == SHADINGMODELID_CLOTH)
        {
            SubsurfaceColor = SubsurfaceData.rgb;
        }
#endif

修改后

#if MATERIAL_SHADINGMODEL_CLOTH || MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB
        else if (ShadingModel == SHADINGMODELID_CLOTH || ShadingModel == SHADINGMODELID_MYSHADERAA || ShadingModel == SHADINGMODELID_MYSHADERAB)
        {
            SubsurfaceColor = SubsurfaceData.rgb;
        }
#endif

 

修正修改

修改前

#if MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN || MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE || MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE || MATERIAL_SHADINGMODEL_CLOTH || MATERIAL_SHADINGMODEL_EYE
    if (ShadingModel == SHADINGMODELID_SUBSURFACE || ShadingModel == SHADINGMODELID_PREINTEGRATED_SKIN || ShadingModel == SHADINGMODELID_SUBSURFACE_PROFILE || ShadingModel == SHADINGMODELID_TWOSIDED_FOLIAGE || ShadingModel == SHADINGMODELID_CLOTH || ShadingModel == SHADINGMODELID_EYE)
    {
        float4 SubsurfaceData = GetMaterialSubsurfaceData(PixelMaterialInputs);

        if (false) // Dummy if to make the ifdef logic play nicely
        {
        }
#if MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN || MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE
        else if (ShadingModel == SHADINGMODELID_SUBSURFACE || ShadingModel == SHADINGMODELID_PREINTEGRATED_SKIN || ShadingModel == SHADINGMODELID_TWOSIDED_FOLIAGE)
        {
            SubsurfaceColor = SubsurfaceData.rgb * View.DiffuseOverrideParameter.w + View.DiffuseOverrideParameter.xyz;
        }
#endif
#if MATERIAL_SHADINGMODEL_CLOTH
        else if (ShadingModel == SHADINGMODELID_CLOTH)
        {
            SubsurfaceColor = SubsurfaceData.rgb;
        }
#endif

        SubsurfaceProfile = SubsurfaceData.a;
    }
#endif

修改后

#if MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN || MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE || MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE || MATERIAL_SHADINGMODEL_CLOTH || MATERIAL_SHADINGMODEL_EYE || MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB

    if (ShadingModel == SHADINGMODELID_SUBSURFACE || ShadingModel == SHADINGMODELID_PREINTEGRATED_SKIN || ShadingModel == SHADINGMODELID_SUBSURFACE_PROFILE || ShadingModel == SHADINGMODELID_TWOSIDED_FOLIAGE || ShadingModel == SHADINGMODELID_CLOTH || ShadingModel == SHADINGMODELID_EYE || ShadingModel == SHADINGMODELID_MYSHADERAA || ShadingModel == SHADINGMODELID_MYSHADERAB)

    {

        float4 SubsurfaceData = GetMaterialSubsurfaceData(PixelMaterialInputs);

 

        if (false) // Dummy if to make the ifdef logic play nicely

        {

        }

#if MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_PREINTEGRATED_SKIN || MATERIAL_SHADINGMODEL_TWOSIDED_FOLIAGE

        else if (ShadingModel == SHADINGMODELID_SUBSURFACE || ShadingModel == SHADINGMODELID_PREINTEGRATED_SKIN || ShadingModel == SHADINGMODELID_TWOSIDED_FOLIAGE)

        {

            SubsurfaceColor = SubsurfaceData.rgb * View.DiffuseOverrideParameter.w + View.DiffuseOverrideParameter.xyz;

        }

#endif

#if MATERIAL_SHADINGMODEL_CLOTH || MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB

        else if (ShadingModel == SHADINGMODELID_CLOTH || ShadingModel == SHADINGMODELID_MYSHADERAA || ShadingModel == SHADINGMODELID_MYSHADERAB)

        {

            SubsurfaceColor = SubsurfaceData.rgb;

        }

#endif

 

        SubsurfaceProfile = SubsurfaceData.a;

    }

#endif

 

(1)

修改前

    // So that the following code can still use DiffuseColor and SpecularColor.
    GBuffer.SpecularColor = ComputeF0(Specular, BaseColor, Metallic);

修改后

    // So that the following code can still use DiffuseColor and SpecularColor.
    GBuffer.SpecularColor = ComputeF0(Specular, BaseColor, Metallic);

#if MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB
    if (GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAA || GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAB)
    {
        GBuffer.SpecularColor = float3(0.0f, 0.0f, 0.0f);
    }    
#endif

(1)

修改前

GBuffer.DiffuseColor = BaseColor - BaseColor * Metallic;

修改后

GBuffer.DiffuseColor = BaseColor - BaseColor * Metallic;

#if MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB
    if (GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAA || GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAB)
    {
        GBuffer.DiffuseColor = float3(0.0f, 0.0f, 0.0f);
    }    
#endif

(1)

修改前

LightAccumulator.EstimatedCost += 0.3f;        // add the cost of getting the shadow terms

        BRANCH
        if( Shadow.SurfaceShadow + Shadow.TransmissionShadow > 0 )
        {
            const bool bNeedsSeparateSubsurfaceLightAccumulation = UseSubsurfaceProfile(GBuffer.ShadingModelID);
            float3 LightColor = LightData.Color;

        #if NON_DIRECTIONAL_DIRECT_LIGHTING
            float Lighting;

            if( LightData.bRectLight )
            {
                FRect Rect = GetRect( ToLight, LightData );

                Lighting = IntegrateLight( Rect, SourceTexture);
            }
            else
            {
                FCapsuleLight Capsule = GetCapsule( ToLight, LightData );

                Lighting = IntegrateLight( Capsule, LightData.bInverseSquared );
            }

            float3 LightingDiffuse = Diffuse_Lambert( GBuffer.DiffuseColor ) * Lighting;
            LightAccumulator_AddSplit(LightAccumulator, LightingDiffuse, 0.0f, 0, LightColor * LightMask * Shadow.SurfaceShadow, bNeedsSeparateSubsurfaceLightAccumulation);
        #else
            FDirectLighting Lighting;

            if (LightData.bRectLight)
            {
                FRect Rect = GetRect( ToLight, LightData );

                #if REFERENCE_QUALITY
                    Lighting = IntegrateBxDF( GBuffer, N, V, Rect, Shadow, SourceTexture, SVPos );
                #else
                    Lighting = IntegrateBxDF( GBuffer, N, V, Rect, Shadow, SourceTexture);
                #endif
            }
            else
            {
                FCapsuleLight Capsule = GetCapsule( ToLight, LightData );

                #if REFERENCE_QUALITY
                    Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, SVPos );
                #else
                    Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, LightData.bInverseSquared );
                #endif
            }

            Lighting.Specular *= LightData.SpecularScale;
                
            LightAccumulator_AddSplit( LightAccumulator, Lighting.Diffuse, Lighting.Specular, Lighting.Diffuse, LightColor * LightMask * Shadow.SurfaceShadow, bNeedsSeparateSubsurfaceLightAccumulation );
            LightAccumulator_AddSplit( LightAccumulator, Lighting.Transmission, 0.0f, Lighting.Transmission, LightColor * LightMask * Shadow.TransmissionShadow, bNeedsSeparateSubsurfaceLightAccumulation );

            LightAccumulator.EstimatedCost += 0.4f;        // add the cost of the lighting computations (should sum up to 1 form one light)
        #endif
        }
    }

修改后

        LightAccumulator.EstimatedCost += 0.3f;        // add the cost of getting the shadow terms

        BRANCH
        #if MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB
        if (GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAA || GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAB)
        {
            float3 LightColor = LightData.Color;

            float3 SSS = float3(GBuffer.CustomData.r, GBuffer.CustomData.g, GBuffer.CustomData.b);
            float SpecStrength = GBuffer.Metallic;
            float ShadowThreshold = GBuffer.Specular;
            float SpecularSize = GBuffer.Roughness;
            float InnerLine = GBuffer.CustomData.a;

            // 纹理数据处理
            float3 BrightColor = GBuffer.BaseColor;
            float3 ShadowColor = GBuffer.BaseColor * SSS;

            // 这里我觉得内部描边的颜色不够明显,于是乘上了0.5
            if (InnerLine < 0.8f)
            {
                InnerLine *= 0.5f;
            }
            float3 InnerLineColor = float3(InnerLine, InnerLine, InnerLine);

            float NdotL = dot(L, N) * Shadow.SurfaceShadow;
            float NdotH = dot(normalize(L + V), N);

            ShadowThreshold = step(ShadowThreshold, NdotL);

            float3 Diffuse = InnerLineColor * LightColor * lerp(ShadowColor, BrightColor, ShadowThreshold);
            float3 Specular = LightColor * BrightColor * ShadowThreshold * InnerLineColor * step(0.2f, SpecularSize * pow(NdotH, SpecStrength));

            LightAccumulator.TotalLight = Diffuse + Specular;
        }
        else
        {
        #endif
        if( Shadow.SurfaceShadow + Shadow.TransmissionShadow > 0 )
        {
            const bool bNeedsSeparateSubsurfaceLightAccumulation = UseSubsurfaceProfile(GBuffer.ShadingModelID);
            float3 LightColor = LightData.Color;

        #if NON_DIRECTIONAL_DIRECT_LIGHTING
            float Lighting;

            if( LightData.bRectLight )
            {
                FRect Rect = GetRect( ToLight, LightData );

                Lighting = IntegrateLight( Rect, SourceTexture);
            }
            else
            {
                FCapsuleLight Capsule = GetCapsule( ToLight, LightData );

                Lighting = IntegrateLight( Capsule, LightData.bInverseSquared );
            }

            float3 LightingDiffuse = Diffuse_Lambert( GBuffer.DiffuseColor ) * Lighting;
            LightAccumulator_AddSplit(LightAccumulator, LightingDiffuse, 0.0f, 0, LightColor * LightMask * Shadow.SurfaceShadow, bNeedsSeparateSubsurfaceLightAccumulation);
        #else
            FDirectLighting Lighting;

            if (LightData.bRectLight)
            {
                FRect Rect = GetRect( ToLight, LightData );

                #if REFERENCE_QUALITY
                    Lighting = IntegrateBxDF( GBuffer, N, V, Rect, Shadow, SourceTexture, SVPos );
                #else
                    Lighting = IntegrateBxDF( GBuffer, N, V, Rect, Shadow, SourceTexture);
                #endif
            }
            else
            {
                FCapsuleLight Capsule = GetCapsule( ToLight, LightData );

                #if REFERENCE_QUALITY
                    Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, SVPos );
                #else
                    Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, LightData.bInverseSquared );
                #endif
            }

            Lighting.Specular *= LightData.SpecularScale;
                
            LightAccumulator_AddSplit( LightAccumulator, Lighting.Diffuse, Lighting.Specular, Lighting.Diffuse, LightColor * LightMask * Shadow.SurfaceShadow, bNeedsSeparateSubsurfaceLightAccumulation );
            LightAccumulator_AddSplit( LightAccumulator, Lighting.Transmission, 0.0f, Lighting.Transmission, LightColor * LightMask * Shadow.TransmissionShadow, bNeedsSeparateSubsurfaceLightAccumulation );

            LightAccumulator.EstimatedCost += 0.4f;        // add the cost of the lighting computations (should sum up to 1 form one light)
        #endif
        #if MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB
        }
        #endif
        }
    }

(1)

修改前

else
    {
        Color.rgb *= EnvBRDF( SpecularColor, GBuffer.Roughness, NoV );
    }

修改后

    else if(GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAA || GBuffer.ShadingModelID == SHADINGMODELID_MYSHADERAA)
    {
        return float3(0.0f, 0.0f, 0.0f);
    }
    else
    {
        Color.rgb *= EnvBRDF( SpecularColor, GBuffer.Roughness, NoV );
    }

(1)

修改前

#define SHADINGMODELID_THIN_TRANSLUCENT        11
#define SHADINGMODELID_NUM                    12

修改后

#define SHADINGMODELID_MYSHADERAA        12
#define SHADINGMODELID_MYSHADERAB        13
#define SHADINGMODELID_NUM                    14

(1)

修改前

最后添加

修改后

#if MATERIAL_SHADINGMODEL_MYSHADERAA || MATERIAL_SHADINGMODEL_MYSHADERAB
    else if (ShadingModel == SHADINGMODELID_MYSHADERAA || ShadingModel == SHADINGMODELID_MYSHADERAB)
    {
        GBuffer.CustomData.rgb = float4(SubsurfaceColor, GetMaterialCustomData0(MaterialParameters));
    }
#endif

(1)

 Shader Model C++ 和 hlsl 对应的地方,

注意, C++ 中的值和 hlsl 中的值一定要相等

C++

hlsl

(1)

C++ 中添加 Shader 中的宏定义

(1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值