diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalSubTarget.cs index 50c9d5c0dc5..6c6d6748387 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Decal/ShaderGraph/DecalSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -50,17 +51,26 @@ protected override IEnumerable EnumerateSubShaders() yield return SubShaders.Decal; } + public static FieldDescriptor AffectsAlbedo = new FieldDescriptor(kMaterial, "AffectsAlbedo", "_MATERIAL_AFFECTS_ALBEDO 1"); + public static FieldDescriptor AffectsNormal = new FieldDescriptor(kMaterial, "AffectsNormal", "_MATERIAL_AFFECTS_NORMAL 1"); + public static FieldDescriptor AffectsEmission = new FieldDescriptor(kMaterial, "AffectsEmission", "_MATERIAL_AFFECTS_EMISSION 1"); + public static FieldDescriptor AffectsMetal = new FieldDescriptor(kMaterial, "AffectsMetal", ""); + public static FieldDescriptor AffectsAO = new FieldDescriptor(kMaterial, "AffectsAO", ""); + public static FieldDescriptor AffectsSmoothness = new FieldDescriptor(kMaterial, "AffectsSmoothness", ""); + public static FieldDescriptor AffectsMaskMap = new FieldDescriptor(kMaterial, "AffectsMaskMap", "_MATERIAL_AFFECTS_MASKMAP 1"); + public static FieldDescriptor DecalDefault = new FieldDescriptor(kMaterial, "DecalDefault", ""); + public override void GetFields(ref TargetFieldContext context) { // Decal properties - context.AddField(HDFields.AffectsAlbedo, decalData.affectsAlbedo); - context.AddField(HDFields.AffectsNormal, decalData.affectsNormal); - context.AddField(HDFields.AffectsEmission, decalData.affectsEmission); - context.AddField(HDFields.AffectsMetal, decalData.affectsMetal); - context.AddField(HDFields.AffectsAO, decalData.affectsAO); - context.AddField(HDFields.AffectsSmoothness, decalData.affectsSmoothness); - context.AddField(HDFields.AffectsMaskMap, decalData.affectsSmoothness || decalData.affectsMetal || decalData.affectsAO); - context.AddField(HDFields.DecalDefault, decalData.affectsAlbedo || decalData.affectsNormal || decalData.affectsMetal || + context.AddField(AffectsAlbedo, decalData.affectsAlbedo); + context.AddField(AffectsNormal, decalData.affectsNormal); + context.AddField(AffectsEmission, decalData.affectsEmission); + context.AddField(AffectsMetal, decalData.affectsMetal); + context.AddField(AffectsAO, decalData.affectsAO); + context.AddField(AffectsSmoothness, decalData.affectsSmoothness); + context.AddField(AffectsMaskMap, decalData.affectsSmoothness || decalData.affectsMetal || decalData.affectsAO); + context.AddField(DecalDefault, decalData.affectsAlbedo || decalData.affectsNormal || decalData.affectsMetal || decalData.affectsAO || decalData.affectsSmoothness ); } @@ -116,12 +126,12 @@ static class SubShaders generatesPreview = true, passes = new PassCollection { - { DecalPasses.Projector3RT, new FieldCondition(HDFields.DecalDefault, true) }, - { DecalPasses.Projector4RT, new FieldCondition(HDFields.DecalDefault, true) }, - { DecalPasses.ProjectorEmissive, new FieldCondition(HDFields.AffectsEmission, true) }, - { DecalPasses.Mesh3RT, new FieldCondition(HDFields.DecalDefault, true) }, - { DecalPasses.Mesh4RT, new FieldCondition(HDFields.DecalDefault, true) }, - { DecalPasses.MeshEmissive, new FieldCondition(HDFields.AffectsEmission, true) }, + { DecalPasses.Projector3RT, new FieldCondition(DecalDefault, true) }, + { DecalPasses.Projector4RT, new FieldCondition(DecalDefault, true) }, + { DecalPasses.ProjectorEmissive, new FieldCondition(AffectsEmission, true) }, + { DecalPasses.Mesh3RT, new FieldCondition(DecalDefault, true) }, + { DecalPasses.Mesh4RT, new FieldCondition(DecalDefault, true) }, + { DecalPasses.MeshEmissive, new FieldCondition(AffectsEmission, true) }, { DecalPasses.Preview, new FieldCondition(Fields.IsPreview, true) }, }, }; @@ -413,37 +423,37 @@ static class DecalRenderStates // ColorMask per Affects Channel { RenderState.ColorMask(s_DecalColorMasks[0]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[1]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[2]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[3]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[4]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, true) } }, { RenderState.ColorMask(s_DecalColorMasks[5]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, true) } }, { RenderState.ColorMask(s_DecalColorMasks[6]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, true) } }, { RenderState.ColorMask(s_DecalColorMasks[7]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, true) } }, }; public static RenderStateCollection ProjectorEmissive = new RenderStateCollection @@ -484,37 +494,37 @@ static class DecalRenderStates // ColorMask per Affects Channel { RenderState.ColorMask(s_DecalColorMasks[0]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[1]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[2]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[3]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, false) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, false) } }, { RenderState.ColorMask(s_DecalColorMasks[4]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, true) } }, { RenderState.ColorMask(s_DecalColorMasks[5]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, false), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, false), + new FieldCondition(AffectsSmoothness, true) } }, { RenderState.ColorMask(s_DecalColorMasks[6]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, false), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, false), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, true) } }, { RenderState.ColorMask(s_DecalColorMasks[7]), new FieldCondition[] { - new FieldCondition(HDFields.AffectsMetal, true), - new FieldCondition(HDFields.AffectsAO, true), - new FieldCondition(HDFields.AffectsSmoothness, true) } }, + new FieldCondition(AffectsMetal, true), + new FieldCondition(AffectsAO, true), + new FieldCondition(AffectsSmoothness, true) } }, }; public static RenderStateCollection MeshEmissive = new RenderStateCollection diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSubTarget.cs index ac2009b5c45..2437a75235d 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Eye/ShaderGraph/EyeSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -22,7 +23,7 @@ sealed partial class EyeSubTarget : LightingSubTarget, ILegacyTarget, IRequiresD protected override string subTargetAssetGuid => "864e4e09d6293cf4d98457f740bb3301"; protected override ShaderID shaderID => HDShaderUtils.ShaderID.SG_Eye; protected override string subShaderInclude => "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Eye/Eye.hlsl"; - protected override FieldDescriptor subShaderField => HDFields.SubShader.Eye; + protected override FieldDescriptor subShaderField => new FieldDescriptor(kSubShader, "Eye SubShader", ""); protected override bool supportRaytracing => false; protected override bool requireSplitLighting => eyeData.subsurfaceScattering; @@ -41,14 +42,17 @@ public EyeData eyeData set => m_EyeData = value; } + public static FieldDescriptor Eye = new FieldDescriptor(kMaterial, "Eye", "_MATERIAL_FEATURE_EYE 1"); + public static FieldDescriptor EyeCinematic = new FieldDescriptor(kMaterial, "EyeCinematic", "_MATERIAL_FEATURE_EYE_CINEMATIC 1"); + public override void GetFields(ref TargetFieldContext context) { base.GetFields(ref context); // Eye specific properties - context.AddField(HDFields.Eye, eyeData.materialType == EyeData.MaterialType.Eye); - context.AddField(HDFields.EyeCinematic, eyeData.materialType == EyeData.MaterialType.EyeCinematic); - context.AddField(HDFields.SubsurfaceScattering, eyeData.subsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); + context.AddField(Eye, eyeData.materialType == EyeData.MaterialType.Eye); + context.AddField(EyeCinematic, eyeData.materialType == EyeData.MaterialType.EyeCinematic); + context.AddField(SubsurfaceScattering, eyeData.subsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); } public override void GetActiveBlocks(ref TargetActiveBlockContext context) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSubTarget.cs index c0633215b11..ae1b2d18bc5 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Fabric/ShaderGraph/FabricSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -22,7 +23,8 @@ sealed partial class FabricSubTarget : LightingSubTarget, ILegacyTarget, IRequir protected override string customInspector => "Rendering.HighDefinition.FabricGUI"; protected override ShaderID shaderID => HDShaderUtils.ShaderID.SG_Fabric; protected override string subShaderInclude => "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fabric/Fabric.hlsl"; - protected override FieldDescriptor subShaderField => HDFields.SubShader.Fabric; + protected override string raytracingInclude => CoreIncludes.kFabricRaytracing; + protected override FieldDescriptor subShaderField => new FieldDescriptor(kSubShader, "Fabric SubShader", ""); protected override bool requireSplitLighting => fabricData.subsurfaceScattering; FabricData m_FabricData; @@ -39,6 +41,9 @@ public FabricData fabricData set => m_FabricData = value; } + public static FieldDescriptor CottonWool = new FieldDescriptor(kMaterial, "CottonWool", "_MATERIAL_FEATURE_COTTON_WOOL 1"); + public static FieldDescriptor Silk = new FieldDescriptor(kMaterial, "Silk", "_MATERIAL_FEATURE_SILK 1"); + protected override SubShaderDescriptor GetRaytracingSubShaderDescriptor() { var descriptor = base.GetRaytracingSubShaderDescriptor(); @@ -54,11 +59,11 @@ public override void GetFields(ref TargetFieldContext context) base.GetFields(ref context); // Fabric specific properties - context.AddField(HDFields.CottonWool, fabricData.materialType == FabricData.MaterialType.CottonWool); - context.AddField(HDFields.Silk, fabricData.materialType == FabricData.MaterialType.Silk); - context.AddField(HDFields.SubsurfaceScattering, fabricData.subsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); - context.AddField(HDFields.Transmission, fabricData.transmission); - context.AddField(HDFields.EnergyConservingSpecular, fabricData.energyConservingSpecular); + context.AddField(CottonWool, fabricData.materialType == FabricData.MaterialType.CottonWool); + context.AddField(Silk, fabricData.materialType == FabricData.MaterialType.Silk); + context.AddField(SubsurfaceScattering, fabricData.subsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); + context.AddField(Transmission, fabricData.transmission); + context.AddField(EnergyConservingSpecular, fabricData.energyConservingSpecular); } public override void GetActiveBlocks(ref TargetActiveBlockContext context) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSubTarget.cs index 243cce9f0a2..ae91588c8e2 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Hair/ShaderGraph/HairSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -22,10 +23,10 @@ sealed partial class HairSubTarget : LightingSubTarget, ILegacyTarget, IRequires protected override string subTargetAssetGuid => "7e681cc79dd8e6c46ba1e8412d519e26"; // HairSubTarget.cs protected override ShaderID shaderID => HDShaderUtils.ShaderID.SG_Hair; protected override string subShaderInclude => CoreIncludes.kHair; - protected override FieldDescriptor subShaderField => HDFields.SubShader.Hair; + protected override string raytracingInclude => CoreIncludes.kHairRaytracing; + protected override FieldDescriptor subShaderField => new FieldDescriptor(kSubShader, "Hair SubShader", ""); protected override bool requireSplitLighting => false; - HairData m_HairData; HairData IRequiresData.data @@ -40,20 +41,26 @@ public HairData hairData set => m_HairData = value; } + public static FieldDescriptor KajiyaKay = new FieldDescriptor(kMaterial, "KajiyaKay", "_MATERIAL_FEATURE_HAIR_KAJIYA_KAY 1"); + public static FieldDescriptor RimTransmissionIntensity = new FieldDescriptor(string.Empty, "RimTransmissionIntensity", "_RIM_TRANSMISSION_INTENSITY 1"); + public static FieldDescriptor HairStrandDirection = new FieldDescriptor(string.Empty, "HairStrandDirection", "_HAIR_STRAND_DIRECTION 1"); + public static FieldDescriptor UseLightFacingNormal = new FieldDescriptor(string.Empty, "UseLightFacingNormal", "_USE_LIGHT_FACING_NORMAL 1"); + public static FieldDescriptor Transmittance = new FieldDescriptor(string.Empty, "Transmittance", "_TRANSMITTANCE 1"); + public override void GetFields(ref TargetFieldContext context) { base.GetFields(ref context); var descs = context.blocks.Select(x => x.descriptor); // Hair specific properties: - context.AddField(HDFields.KajiyaKay, hairData.materialType == HairData.MaterialType.KajiyaKay); - context.AddField(HDFields.HairStrandDirection, descs.Contains(HDBlockFields.SurfaceDescription.HairStrandDirection) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.HairStrandDirection)); - context.AddField(HDFields.RimTransmissionIntensity, descs.Contains(HDBlockFields.SurfaceDescription.RimTransmissionIntensity) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.RimTransmissionIntensity)); - context.AddField(HDFields.UseLightFacingNormal, hairData.useLightFacingNormal); - context.AddField(HDFields.Transmittance, descs.Contains(HDBlockFields.SurfaceDescription.Transmittance) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.Transmittance)); + context.AddField(KajiyaKay, hairData.materialType == HairData.MaterialType.KajiyaKay); + context.AddField(HairStrandDirection, descs.Contains(HDBlockFields.SurfaceDescription.HairStrandDirection) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.HairStrandDirection)); + context.AddField(RimTransmissionIntensity, descs.Contains(HDBlockFields.SurfaceDescription.RimTransmissionIntensity) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.RimTransmissionIntensity)); + context.AddField(UseLightFacingNormal, hairData.useLightFacingNormal); + context.AddField(Transmittance, descs.Contains(HDBlockFields.SurfaceDescription.Transmittance) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.Transmittance)); // Misc - context.AddField(HDFields.SpecularAA, lightingData.specularAA && + context.AddField(SpecularAA, lightingData.specularAA && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAThreshold) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAScreenSpaceVariance)); } diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSubTarget.cs index 214dd359440..15dfd27fadc 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Lit/ShaderGraph/HDLitSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -36,7 +37,8 @@ public HDLitData litData protected override string subTargetAssetGuid => "caab952c840878340810cca27417971c"; // HDLitSubTarget.cs protected override string postDecalsInclude => "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitDecalData.hlsl"; protected override ShaderID shaderID => HDShaderUtils.ShaderID.SG_Lit; - protected override FieldDescriptor subShaderField => HDFields.SubShader.Lit; + protected override string raytracingInclude => CoreIncludes.kLitRaytracing; + protected override FieldDescriptor subShaderField => new FieldDescriptor(kSubShader, "Lit Subshader", ""); protected override string subShaderInclude => CoreIncludes.kLit; // SubShader features @@ -67,6 +69,17 @@ protected override SubShaderDescriptor GetRaytracingSubShaderDescriptor() return descriptor; } + public static FieldDescriptor ClearCoat = new FieldDescriptor(kMaterial, "ClearCoat", "_MATERIAL_FEATURE_CLEAR_COAT"); + public static FieldDescriptor Translucent = new FieldDescriptor(kMaterial, "Translucent", "_MATERIAL_FEATURE_TRANSLUCENT 1"); + public static FieldDescriptor Standard = new FieldDescriptor(kMaterial, "Standard", "_MATERIAL_FEATURE_TRANSMISSION 1"); + public static FieldDescriptor SpecularColor = new FieldDescriptor(kMaterial, "SpecularColor", "_MATERIAL_FEATURE_TRANSMISSION 1"); + + // Refraction + public static FieldDescriptor Refraction = new FieldDescriptor(string.Empty, "Refraction", "_HAS_REFRACTION 1"); + public static FieldDescriptor RefractionBox = new FieldDescriptor(string.Empty, "RefractionBox", "_REFRACTION_PLANE 1"); + public static FieldDescriptor RefractionSphere = new FieldDescriptor(string.Empty, "RefractionSphere", "_REFRACTION_SPHERE 1"); + public static FieldDescriptor RefractionThin = new FieldDescriptor(string.Empty, "RefractionThin", "_REFRACTION_THIN 1"); + public override void GetFields(ref TargetFieldContext context) { base.GetFields(ref context); @@ -76,31 +89,30 @@ public override void GetFields(ref TargetFieldContext context) bool hasRefraction = (systemData.surfaceType == SurfaceType.Transparent && systemData.renderingPass != HDRenderQueue.RenderQueueType.PreRefraction && litData.refractionModel != ScreenSpaceRefraction.RefractionModel.None); // Lit specific properties - context.AddField(HDFields.DotsProperties, context.hasDotsProperties); + context.AddField(DotsProperties, context.hasDotsProperties); // Material - context.AddField(HDFields.Anisotropy, litData.materialType == HDLitData.MaterialType.Anisotropy); - context.AddField(HDFields.Iridescence, litData.materialType == HDLitData.MaterialType.Iridescence); - context.AddField(HDFields.SpecularColor, litData.materialType == HDLitData.MaterialType.SpecularColor); - context.AddField(HDFields.Standard, litData.materialType == HDLitData.MaterialType.Standard); - context.AddField(HDFields.SubsurfaceScattering, litData.materialType == HDLitData.MaterialType.SubsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); - context.AddField(HDFields.Transmission, (litData.materialType == HDLitData.MaterialType.SubsurfaceScattering && litData.sssTransmission) || + context.AddField(Anisotropy, litData.materialType == HDLitData.MaterialType.Anisotropy); + context.AddField(Iridescence, litData.materialType == HDLitData.MaterialType.Iridescence); + context.AddField(SpecularColor, litData.materialType == HDLitData.MaterialType.SpecularColor); + context.AddField(Standard, litData.materialType == HDLitData.MaterialType.Standard); + context.AddField(SubsurfaceScattering, litData.materialType == HDLitData.MaterialType.SubsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); + context.AddField(Transmission, (litData.materialType == HDLitData.MaterialType.SubsurfaceScattering && litData.sssTransmission) || (litData.materialType == HDLitData.MaterialType.Translucent)); - context.AddField(HDFields.Translucent, litData.materialType == HDLitData.MaterialType.Translucent); + context.AddField(Translucent, litData.materialType == HDLitData.MaterialType.Translucent); // Refraction - context.AddField(HDFields.Refraction, hasRefraction); - context.AddField(HDFields.RefractionBox, hasRefraction && litData.refractionModel == ScreenSpaceRefraction.RefractionModel.Box); - context.AddField(HDFields.RefractionSphere, hasRefraction && litData.refractionModel == ScreenSpaceRefraction.RefractionModel.Sphere); - context.AddField(HDFields.RefractionThin, hasRefraction && litData.refractionModel == ScreenSpaceRefraction.RefractionModel.Thin); + context.AddField(Refraction, hasRefraction); + context.AddField(RefractionBox, hasRefraction && litData.refractionModel == ScreenSpaceRefraction.RefractionModel.Box); + context.AddField(RefractionSphere, hasRefraction && litData.refractionModel == ScreenSpaceRefraction.RefractionModel.Sphere); + context.AddField(RefractionThin, hasRefraction && litData.refractionModel == ScreenSpaceRefraction.RefractionModel.Thin); // Misc - - context.AddField(HDFields.EnergyConservingSpecular, litData.energyConservingSpecular); - context.AddField(HDFields.CoatMask, descs.Contains(HDBlockFields.SurfaceDescription.CoatMask) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.CoatMask) && litData.clearCoat); - context.AddField(HDFields.ClearCoat, litData.clearCoat); // Enable clear coat material feature - context.AddField(HDFields.Tangent, descs.Contains(HDBlockFields.SurfaceDescription.Tangent) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.Tangent)); - context.AddField(HDFields.RayTracing, litData.rayTracing); + context.AddField(EnergyConservingSpecular, litData.energyConservingSpecular); + context.AddField(CoatMask, descs.Contains(HDBlockFields.SurfaceDescription.CoatMask) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.CoatMask) && litData.clearCoat); + context.AddField(ClearCoat, litData.clearCoat); // Enable clear coat material feature + context.AddField(Tangent, descs.Contains(HDBlockFields.SurfaceDescription.Tangent) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.Tangent)); + context.AddField(RayTracing, litData.rayTracing); } public override void GetActiveBlocks(ref TargetActiveBlockContext context) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDFields.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDFields.cs index a3d734b28e8..67d4d191ff1 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDFields.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDFields.cs @@ -5,49 +5,21 @@ namespace UnityEditor.Rendering.HighDefinition static class HDFields { #region Tags - const string kMaterial = "Material"; - const string kDots = "Dots"; - const string kSpecular = "Specular"; - const string kDoubleSided = "DoubleSided"; - const string kDistortion = "Distortion"; - const string kBaseParametrization = "BaseParametrization"; - const string kDualSpecularLobeParametrization = "DualSpecularLobeParametrization"; - const string kSSSpecularOcclusionBaseMode = "ScreenSpaceSpecularOcclusionBaseMode"; - const string kSSSpecularOcclusionAOConeSize = "ScreenSpaceSpecularOcclusionAOConeSize"; - const string kSSSpecularOcclusionAOConeDir = "ScreenSpaceSpecularOcclusionAOConeDir"; - const string kDataBasedSpecularOcclusionBaseMode = "DataBasedSpecularOcclusionBaseMode"; - const string kDataBasedSpecularOcclusionAOConeSize = "DataBasedSpecularOcclusionAOConeSize"; - const string kSpecularOcclusionConeFixupMethod = "SpecularOcclusionConeFixupMethod"; - const string kShaderPass = "ShaderPass"; - const string kSubShader = "SubShader"; + public const string kMaterial = "Material"; + public const string kDots = "Dots"; + public const string kSpecular = "Specular"; + public const string kDoubleSided = "DoubleSided"; + public const string kDistortion = "Distortion"; + public const string kShaderPass = "ShaderPass"; + public const string kSubShader = "SubShader"; #endregion #region Fields // Material public static FieldDescriptor Anisotropy = new FieldDescriptor(kMaterial, "Anisotropy", "_MATERIAL_FEATURE_TRANSMISSION 1"); public static FieldDescriptor Iridescence = new FieldDescriptor(kMaterial, "Iridescence", "_MATERIAL_FEATURE_TRANSMISSION 1"); - public static FieldDescriptor SpecularColor = new FieldDescriptor(kMaterial, "SpecularColor", "_MATERIAL_FEATURE_TRANSMISSION 1"); - public static FieldDescriptor Standard = new FieldDescriptor(kMaterial, "Standard", "_MATERIAL_FEATURE_TRANSMISSION 1"); public static FieldDescriptor SubsurfaceScattering = new FieldDescriptor(kMaterial, "SubsurfaceScattering", "_MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1"); public static FieldDescriptor Transmission = new FieldDescriptor(kMaterial, "Transmission", "_MATERIAL_FEATURE_TRANSMISSION 1"); - public static FieldDescriptor Translucent = new FieldDescriptor(kMaterial, "Translucent", "_MATERIAL_FEATURE_TRANSLUCENT 1"); - public static FieldDescriptor Coat = new FieldDescriptor(kMaterial, "Coat", "_MATERIAL_FEATURE_COAT"); - public static FieldDescriptor ClearCoat = new FieldDescriptor(kMaterial, "ClearCoat", "_MATERIAL_FEATURE_CLEAR_COAT"); - public static FieldDescriptor CoatNormal = new FieldDescriptor(kMaterial, "CoatNormal", "_MATERIAL_FEATURE_COAT_NORMALMAP"); - public static FieldDescriptor DualSpecularLobe = new FieldDescriptor(kMaterial, "DualSpecularLobe", "_MATERIAL_FEATURE_DUAL_SPECULAR_LOBE"); - public static FieldDescriptor Eye = new FieldDescriptor(kMaterial, "Eye", "_MATERIAL_FEATURE_EYE 1"); - public static FieldDescriptor EyeCinematic = new FieldDescriptor(kMaterial, "EyeCinematic", "_MATERIAL_FEATURE_EYE_CINEMATIC 1"); - public static FieldDescriptor CottonWool = new FieldDescriptor(kMaterial, "CottonWool", "_MATERIAL_FEATURE_COTTON_WOOL 1"); - public static FieldDescriptor Silk = new FieldDescriptor(kMaterial, "Silk", "_MATERIAL_FEATURE_SILK 1"); - public static FieldDescriptor KajiyaKay = new FieldDescriptor(kMaterial, "KajiyaKay", "_MATERIAL_FEATURE_HAIR_KAJIYA_KAY 1"); - public static FieldDescriptor AffectsAlbedo = new FieldDescriptor(kMaterial, "AffectsAlbedo", "_MATERIAL_AFFECTS_ALBEDO 1"); - public static FieldDescriptor AffectsNormal = new FieldDescriptor(kMaterial, "AffectsNormal", "_MATERIAL_AFFECTS_NORMAL 1"); - public static FieldDescriptor AffectsEmission = new FieldDescriptor(kMaterial, "AffectsEmission", "_MATERIAL_AFFECTS_EMISSION 1"); - public static FieldDescriptor AffectsMetal = new FieldDescriptor(kMaterial, "AffectsMetal", ""); - public static FieldDescriptor AffectsAO = new FieldDescriptor(kMaterial, "AffectsAO", ""); - public static FieldDescriptor AffectsSmoothness = new FieldDescriptor(kMaterial, "AffectsSmoothness", ""); - public static FieldDescriptor AffectsMaskMap = new FieldDescriptor(kMaterial, "AffectsMaskMap", "_MATERIAL_AFFECTS_MASKMAP 1"); - public static FieldDescriptor DecalDefault = new FieldDescriptor(kMaterial, "DecalDefault", ""); // Dots public static FieldDescriptor DotsInstancing = new FieldDescriptor(kDots, "Instancing", ""); @@ -56,13 +28,6 @@ static class HDFields // Specular public static FieldDescriptor EnergyConservingSpecular = new FieldDescriptor(kSpecular, "EnergyConserving", "_ENERGY_CONSERVING_SPECULAR 1"); public static FieldDescriptor SpecularAA = new FieldDescriptor(kSpecular, "AA", "_ENABLE_GEOMETRIC_SPECULAR_AA 1"); - public static FieldDescriptor GeometricSpecularAA = new FieldDescriptor(kSpecular, "GeometricAA", "_ENABLE_GEOMETRIC_SPECULAR_AA 1"); - - // Specular Occlusion - public static FieldDescriptor SpecularOcclusion = new FieldDescriptor(string.Empty, "SpecularOcclusion", "_ENABLESPECULAROCCLUSION"); - public static FieldDescriptor SpecularOcclusionFromAO = new FieldDescriptor(string.Empty, "SpecularOcclusionFromAO", "_SPECULAR_OCCLUSION_FROM_AO 1"); - public static FieldDescriptor SpecularOcclusionFromAOBentNormal = new FieldDescriptor(string.Empty, "SpecularOcclusionFromAOBentNormal", "_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1"); - public static FieldDescriptor SpecularOcclusionCustom = new FieldDescriptor(string.Empty, "SpecularOcclusionCustom", "_SPECULAR_OCCLUSION_CUSTOM 1"); // Double Sided public static FieldDescriptor DoubleSided = new FieldDescriptor(string.Empty, "DoubleSided", ""); @@ -76,17 +41,11 @@ static class HDFields public static FieldDescriptor DistortionReplace = new FieldDescriptor(kDistortion, "Replace", ""); public static FieldDescriptor TransparentDistortion = new FieldDescriptor(kDistortion, "TransparentDistortion", ""); - // Refraction - public static FieldDescriptor Refraction = new FieldDescriptor(string.Empty, "Refraction", "_HAS_REFRACTION 1"); - public static FieldDescriptor RefractionBox = new FieldDescriptor(string.Empty, "RefractionBox", "_REFRACTION_PLANE 1"); - public static FieldDescriptor RefractionSphere = new FieldDescriptor(string.Empty, "RefractionSphere", "_REFRACTION_SPHERE 1"); - public static FieldDescriptor RefractionThin = new FieldDescriptor(string.Empty, "RefractionThin", "_REFRACTION_THIN 1"); - - // Base Parametrization - public static FieldDescriptor BaseParamSpecularColor = new FieldDescriptor(kBaseParametrization, "SpecularColor", "_MATERIAL_FEATURE_SPECULAR_COLOR"); - - // Dual Specular Lobe Parametrization - public static FieldDescriptor HazyGloss = new FieldDescriptor(kDualSpecularLobeParametrization, "HazyGloss", "_MATERIAL_FEATURE_HAZY_GLOSS"); + // Specular Occlusion + public static FieldDescriptor SpecularOcclusion = new FieldDescriptor(string.Empty, "SpecularOcclusion", "_ENABLESPECULAROCCLUSION"); + public static FieldDescriptor SpecularOcclusionFromAO = new FieldDescriptor(string.Empty, "SpecularOcclusionFromAO", "_SPECULAR_OCCLUSION_FROM_AO 1"); + public static FieldDescriptor SpecularOcclusionFromAOBentNormal = new FieldDescriptor(string.Empty, "SpecularOcclusionFromAOBentNormal", "_SPECULAR_OCCLUSION_FROM_AO_BENT_NORMAL 1"); + public static FieldDescriptor SpecularOcclusionCustom = new FieldDescriptor(string.Empty, "SpecularOcclusionCustom", "_SPECULAR_OCCLUSION_CUSTOM 1"); // Misc public static FieldDescriptor DoAlphaTest = new FieldDescriptor(string.Empty, "DoAlphaTest", "_DO_ALPHA_TEST 1"); @@ -101,85 +60,16 @@ static class HDFields public static FieldDescriptor BentNormal = new FieldDescriptor(string.Empty, "BentNormal", "_BENT_NORMAL 1"); public static FieldDescriptor AmbientOcclusion = new FieldDescriptor(string.Empty, "AmbientOcclusion", "_AMBIENT_OCCLUSION 1"); public static FieldDescriptor CoatMask = new FieldDescriptor(string.Empty, "CoatMask", "_COAT_MASK 1"); - public static FieldDescriptor CoatMaskZero = new FieldDescriptor(string.Empty, "CoatMaskZero", ""); - public static FieldDescriptor CoatMaskOne = new FieldDescriptor(string.Empty, "CoatMaskOne", ""); public static FieldDescriptor Tangent = new FieldDescriptor(string.Empty, "Tangent", "_TANGENT 1"); public static FieldDescriptor LightingGI = new FieldDescriptor(string.Empty, "LightingGI", "_LIGHTING_GI 1"); public static FieldDescriptor BackLightingGI = new FieldDescriptor(string.Empty, "BackLightingGI", "_BACK_LIGHTING_GI 1"); public static FieldDescriptor DepthOffset = new FieldDescriptor(string.Empty, "DepthOffset", "_DEPTH_OFFSET 1"); public static FieldDescriptor TransparentWritesMotionVec = new FieldDescriptor(string.Empty, "TransparentWritesMotionVec", "_WRITE_TRANSPARENT_MOTION_VECTOR 1"); - public static FieldDescriptor HairStrandDirection = new FieldDescriptor(string.Empty, "HairStrandDirection", "_HAIR_STRAND_DIRECTION 1"); - public static FieldDescriptor Transmittance = new FieldDescriptor(string.Empty, "Transmittance", "_TRANSMITTANCE 1"); - public static FieldDescriptor RimTransmissionIntensity = new FieldDescriptor(string.Empty, "RimTransmissionIntensity", "_RIM_TRANSMISSION_INTENSITY 1"); - public static FieldDescriptor UseLightFacingNormal = new FieldDescriptor(string.Empty, "UseLightFacingNormal", "_USE_LIGHT_FACING_NORMAL 1"); - public static FieldDescriptor CapHazinessIfNotMetallic = new FieldDescriptor(string.Empty, "CapHazinessIfNotMetallic", ""); public static FieldDescriptor TransparentBackFace = new FieldDescriptor(string.Empty, "TransparentBackFace", string.Empty); public static FieldDescriptor TransparentDepthPrePass = new FieldDescriptor(string.Empty, "TransparentDepthPrePass", string.Empty); public static FieldDescriptor TransparentDepthPostPass = new FieldDescriptor(string.Empty, "TransparentDepthPostPass", string.Empty); - public static FieldDescriptor EnableShadowMatte = new FieldDescriptor(string.Empty, "EnableShadowMatte", "_ENABLE_SHADOW_MATTE"); public static FieldDescriptor RayTracing = new FieldDescriptor(string.Empty, "RayTracing", string.Empty); - - // Advanced - public static FieldDescriptor AnisotropyForAreaLights = new FieldDescriptor(string.Empty, "AnisotropyForAreaLights", "_ANISOTROPY_FOR_AREA_LIGHTS"); - public static FieldDescriptor RecomputeStackPerLight = new FieldDescriptor(string.Empty, "RecomputeStackPerLight", "_VLAYERED_RECOMPUTE_PERLIGHT"); - public static FieldDescriptor HonorPerLightMinRoughness = new FieldDescriptor(string.Empty, "HonorPerLightMinRoughness", "_STACK_LIT_HONORS_LIGHT_MIN_ROUGHNESS"); - public static FieldDescriptor ShadeBaseUsingRefractedAngles = new FieldDescriptor(string.Empty, "ShadeBaseUsingRefractedAngles", "_VLAYERED_USE_REFRACTED_ANGLES_FOR_BASE"); - public static FieldDescriptor StackLitDebug = new FieldDescriptor(string.Empty, "StackLitDebug", "_STACKLIT_DEBUG"); - - // Screen Space Specular Occlusion Base Mode - public static FieldDescriptor SSSpecularOcclusionBaseModeOff = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "Off", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_DISABLED"); - public static FieldDescriptor SSSpecularOcclusionBaseModeDirectFromAO = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "DirectFromAO", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_FROM_AO"); - public static FieldDescriptor SSSpecularOcclusionBaseModeConeConeFromBentAO = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "ConeConeFromBentAO", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_CONECONE"); - public static FieldDescriptor SSSpecularOcclusionBaseModeSPTDIntegrationOfBentAO = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "SPTDIntegrationOfBentAO", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_SPTD"); - public static FieldDescriptor SSSpecularOcclusionBaseModeCustom = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "Custom", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_FROM_AO"); - - // Screen Space Specular Occlusion AO Cone Size - public static FieldDescriptor SSSpecularOcclusionAOConeSizeUniformAO = new FieldDescriptor(kSSSpecularOcclusionAOConeSize, "UniformAO", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_UNIFORM"); - public static FieldDescriptor SSSpecularOcclusionAOConeSizeCosWeightedAO = new FieldDescriptor(kSSSpecularOcclusionAOConeSize, "CosWeightedAO", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS"); - public static FieldDescriptor SSSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO = new FieldDescriptor(kSSSpecularOcclusionAOConeSize, "CosWeightedBentCorrectAO", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS_BENT_CORRECTION"); - - // Screen Space Specular Occlusion AO Cone Dir - public static FieldDescriptor SSSpecularOcclusionAOConeDirGeomNormal = new FieldDescriptor(kSSSpecularOcclusionAOConeDir, "GeomNormal", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_DIR BENT_VISIBILITY_DIR_GEOM_NORMAL"); - public static FieldDescriptor SSSpecularOcclusionAOConeDirBentNormal = new FieldDescriptor(kSSSpecularOcclusionAOConeDir, "BentNormal", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_DIR BENT_VISIBILITY_DIR_BENT_NORMAL"); - public static FieldDescriptor SSSpecularOcclusionAOConeDirShadingNormal = new FieldDescriptor(kSSSpecularOcclusionAOConeDir, "ShadingNormal", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_DIR BENT_VISIBILITY_DIR_SHADING_NORMAL"); - - // Data Bases Specular Occlusion Base Mode - public static FieldDescriptor DataBasedSpecularOcclusionBaseModeOff = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "Off", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_DISABLED"); - public static FieldDescriptor DataBasedSpecularOcclusionBaseModeDirectFromAO = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "DirectFromAO", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_FROM_AO"); - public static FieldDescriptor DataBasedSpecularOcclusionBaseModeConeConeFromBentAO = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "ConeConeFromBentAO", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_CONECONE"); - public static FieldDescriptor DataBasedSpecularOcclusionBaseModeSPTDIntegrationOfBentAO = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "SPTDIntegrationOfBentAO", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_SPTD"); - public static FieldDescriptor DataBasedSpecularOcclusionBaseModeCustom = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "Custom", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_CUSTOM_EXT_INPUT"); - - // Data Based Specular Occlusion AO Cone Size - public static FieldDescriptor DataBasedSpecularOcclusionAOConeSizeUniformAO = new FieldDescriptor(kDataBasedSpecularOcclusionAOConeSize, "UniformAO", "_DATABASED_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_UNIFORM"); - public static FieldDescriptor DataBasedSpecularOcclusionAOConeSizeCosWeightedAO = new FieldDescriptor(kDataBasedSpecularOcclusionAOConeSize, "CosWeightedAO", "_DATABASED_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS"); - public static FieldDescriptor DataBasedSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO = new FieldDescriptor(kDataBasedSpecularOcclusionAOConeSize, "CosWeightedBentCorrectAO", "_DATABASED_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS_BENT_CORRECTION"); - - // Specular Occlusion Cone Fixup Method - public static FieldDescriptor SpecularOcclusionConeFixupMethodOff = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "Off", "_BENT_VISIBILITY_FIXUP_FLAGS BENT_VISIBILITY_FIXUP_FLAGS_NONE"); - public static FieldDescriptor SpecularOcclusionConeFixupMethodBoostBSDFRoughness = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "BoostBSDFRoughness", "_BENT_VISIBILITY_FIXUP_FLAGS BENT_VISIBILITY_FIXUP_FLAGS_BOOST_BSDF_ROUGHNESS"); - public static FieldDescriptor SpecularOcclusionConeFixupMethodTiltDirectionToGeomNormal = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "TiltDirectionToGeomNormal", "_BENT_VISIBILITY_FIXUP_FLAGS BENT_VISIBILITY_FIXUP_FLAGS_TILT_BENTNORMAL_TO_GEOM"); - public static FieldDescriptor SpecularOcclusionConeFixupMethodBoostAndTilt = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "BoostAndTilt", "_BENT_VISIBILITY_FIXUP_FLAGS (BENT_VISIBILITY_FIXUP_FLAGS_BOOST_BSDF_ROUGHNESS|BENT_VISIBILITY_FIXUP_FLAGS_TILT_BENTNORMAL_TO_GEOM)"); - - public struct ShaderPass - { - public static FieldDescriptor RayTracingGBuffer = new FieldDescriptor(kShaderPass, "Raytracing GBuffer","SHADERPASS_RAYTRACING_GBUFFER"); - public static FieldDescriptor RaytracingSubSurface = new FieldDescriptor(kShaderPass, "Raytracing SubSurface", "SHADERPASS_RAYTRACING_SUB_SURFACE"); - public static FieldDescriptor RaytracingIndirect = new FieldDescriptor(kShaderPass, "Raytracing Indirect", "SHADERPASS_RAYTRACING_INDIRECT"); - public static FieldDescriptor RaytracingForward = new FieldDescriptor(kShaderPass, "Raytracing Forward", "SHADERPASS_RAYTRACING_FORWARD"); - public static FieldDescriptor RaytracingPathTracing = new FieldDescriptor(kShaderPass, "Raytracing Path Tracing", "SHADERPASS_PATH_TRACING"); - public static FieldDescriptor RaytracingVisibility = new FieldDescriptor(kShaderPass, "Raytracing Visibility", "SHADERPASS_RAYTRACING_VISIBILITY"); - } - - public struct SubShader - { - public static FieldDescriptor Lit = new FieldDescriptor(kSubShader, "Lit Subshader", ""); - public static FieldDescriptor Fabric = new FieldDescriptor(kSubShader, "Fabric SubShader", ""); - public static FieldDescriptor StackLit = new FieldDescriptor(kSubShader, "StackLit SubShader", ""); - public static FieldDescriptor Unlit = new FieldDescriptor(kSubShader, "Unlit SubShader", ""); - public static FieldDescriptor Hair = new FieldDescriptor(kSubShader, "Hair SubShader", ""); - public static FieldDescriptor Eye = new FieldDescriptor(kSubShader, "Eye SubShader", ""); - } + public static FieldDescriptor Unlit = new FieldDescriptor(string.Empty, "Unlit", string.Empty); #endregion } diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDShaderPasses.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDShaderPasses.cs index 9e34fc250e1..80efacbb128 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDShaderPasses.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDShaderPasses.cs @@ -425,7 +425,7 @@ IncludeCollection GenerateIncludes() { { CoreKeywords.HDBase }, { CoreKeywordDescriptors.DebugDisplay }, - { CoreKeywordDescriptors.Shadow, new FieldCondition(HDFields.EnableShadowMatte, true) }, + { CoreKeywordDescriptors.Shadow, new FieldCondition(HDUnlitSubTarget.EnableShadowMatte, true) }, }; #endregion @@ -865,9 +865,38 @@ public static PassDescriptor GenerateRaytracingIndirect(bool supportLighting) pragmas = CorePragmas.RaytracingBasic, defines = supportLighting ? RaytracingIndirectDefines : null, keywords = CoreKeywords.RaytracingIndirect, - includes = CoreIncludes.Raytracing, - requiredFields = new FieldCollection(){ HDFields.ShaderPass.RaytracingIndirect }, + includes = GenerateIncludes(), }; + + IncludeCollection GenerateIncludes() + { + var includes = new IncludeCollection { CoreIncludes.RaytracingCorePregraph }; + + includes.Add(CoreIncludes.kRaytracingIntersection, IncludeLocation.Pregraph); + + if (supportLighting) + { + includes.Add(CoreIncludes.kLighting, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kLightLoopDef, IncludeLocation.Pregraph); + } + + // Each material has a specific hlsl file that should be included pre-graph and holds the lighting model + includes.Add(CoreIncludes.kPassPlaceholder, IncludeLocation.Pregraph); + // We need to then include the ray tracing missing bits for the lighting models (based on which lighting model) + includes.Add(CoreIncludes.kRaytracingPlaceholder, IncludeLocation.Pregraph); + // We want to have the ray tracing light loop if this is an indirect sub-shader or a forward one and it is not the unlit shader + if (supportLighting) + includes.Add(CoreIncludes.kRaytracingLightLoop, IncludeLocation.Pregraph); + + includes.Add(CoreIncludes.CoreUtility); + includes.Add(CoreIncludes.kRaytracingCommon, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph); + + // post graph includes + includes.Add(CoreIncludes.kPassRaytracingIndirect, IncludeLocation.Postgraph); + + return includes; + } } public static DefineCollection RaytracingIndirectDefines = new DefineCollection @@ -899,9 +928,30 @@ public static PassDescriptor GenerateRaytracingVisibility(bool supportLighting) pragmas = CorePragmas.RaytracingBasic, defines = supportLighting ? RaytracingVisibilityDefines : null, keywords = CoreKeywords.RaytracingVisiblity, - requiredFields = new FieldCollection(){ HDFields.ShaderPass.RaytracingVisibility }, - includes = CoreIncludes.Raytracing, + includes = GenerateIncludes(), }; + + IncludeCollection GenerateIncludes() + { + var includes = new IncludeCollection { CoreIncludes.RaytracingCorePregraph }; + + // We want the generic payload if this is not a gbuffer or a subsurface subshader + includes.Add(CoreIncludes.kRaytracingIntersection, IncludeLocation.Pregraph); + + // Each material has a specific hlsl file that should be included pre-graph and holds the lighting model + includes.Add(CoreIncludes.kPassPlaceholder, IncludeLocation.Pregraph); + // We need to then include the ray tracing missing bits for the lighting models (based on which lighting model) + includes.Add(CoreIncludes.kRaytracingPlaceholder, IncludeLocation.Pregraph); + + includes.Add(CoreIncludes.CoreUtility); + includes.Add(CoreIncludes.kRaytracingCommon, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph); + + // post graph includes + includes.Add(CoreIncludes.kPassRaytracingVisbility, IncludeLocation.Postgraph); + + return includes; + } } public static DefineCollection RaytracingVisibilityDefines = new DefineCollection @@ -931,9 +981,41 @@ public static PassDescriptor GenerateRaytracingForward(bool supportLighting) pragmas = CorePragmas.RaytracingBasic, defines = supportLighting ? RaytracingForwardDefines : null, keywords = CoreKeywords.RaytracingGBufferForward, - includes = CoreIncludes.Raytracing, - requiredFields = new FieldCollection(){ HDFields.ShaderPass.RaytracingForward }, + includes = GenerateIncludes(), }; + + IncludeCollection GenerateIncludes() + { + var includes = new IncludeCollection { CoreIncludes.RaytracingCorePregraph }; + + // We want the generic payload if this is not a gbuffer or a subsurface subshader + includes.Add(CoreIncludes.kRaytracingIntersection, IncludeLocation.Pregraph); + + // We want to have the lighting include if this is an indirect sub-shader, a forward one or the path tracing (and this is not an unlit) + if (supportLighting) + { + includes.Add(CoreIncludes.kLighting, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kLightLoopDef, IncludeLocation.Pregraph); + } + + // Each material has a specific hlsl file that should be included pre-graph and holds the lighting model + includes.Add(CoreIncludes.kPassPlaceholder, IncludeLocation.Pregraph); + // We need to then include the ray tracing missing bits for the lighting models (based on which lighting model) + includes.Add(CoreIncludes.kRaytracingPlaceholder, IncludeLocation.Pregraph); + + // We want to have the ray tracing light loop if this is an indirect sub-shader or a forward one and it is not the unlit shader + if (supportLighting) + includes.Add(CoreIncludes.kRaytracingLightLoop, IncludeLocation.Pregraph); + + includes.Add(CoreIncludes.CoreUtility); + includes.Add(CoreIncludes.kRaytracingCommon, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph); + + // post graph includes + includes.Add(CoreIncludes.kPassRaytracingForward, IncludeLocation.Postgraph); + + return includes; + } } @@ -966,9 +1048,37 @@ public static PassDescriptor GenerateRaytracingGBuffer(bool supportLighting) pragmas = CorePragmas.RaytracingBasic, defines = supportLighting ? RaytracingGBufferDefines : null, keywords = CoreKeywords.RaytracingGBufferForward, - includes = CoreIncludes.Raytracing, - requiredFields = new FieldCollection(){ HDFields.ShaderPass.RayTracingGBuffer }, + includes = GenerateIncludes(), }; + + IncludeCollection GenerateIncludes() + { + var includes = new IncludeCollection { CoreIncludes.RaytracingCorePregraph }; + + includes.Add(CoreIncludes.kRaytracingIntersectionGBuffer, IncludeLocation.Pregraph); + + // Each material has a specific hlsl file that should be included pre-graph and holds the lighting model + includes.Add(CoreIncludes.kPassPlaceholder, IncludeLocation.Pregraph); + + // We want to have the normal buffer include if this is a gbuffer and unlit shader + if (!supportLighting) + includes.Add(CoreIncludes.kNormalBuffer, IncludeLocation.Pregraph); + + // If this is the gbuffer sub-shader, we want the standard lit data + includes.Add(CoreIncludes.kStandardLit, IncludeLocation.Pregraph); + + // We need to then include the ray tracing missing bits for the lighting models (based on which lighting model) + includes.Add(CoreIncludes.kRaytracingPlaceholder, IncludeLocation.Pregraph); + + includes.Add(CoreIncludes.CoreUtility); + includes.Add(CoreIncludes.kRaytracingCommon, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph); + + // post graph includes + includes.Add(CoreIncludes.kPassRaytracingGBuffer, IncludeLocation.Postgraph); + + return includes; + } } public static DefineCollection RaytracingGBufferDefines = new DefineCollection @@ -999,9 +1109,37 @@ public static PassDescriptor GeneratePathTracing(bool supportLighting) pragmas = CorePragmas.RaytracingBasic, defines = supportLighting ? RaytracingPathTracingDefines : null, keywords = CoreKeywords.HDBaseNoCrossFade, - includes = CoreIncludes.Raytracing, - requiredFields = new FieldCollection(){ HDFields.ShaderPass.RaytracingPathTracing }, + includes = GenerateIncludes(), }; + + IncludeCollection GenerateIncludes() + { + var includes = new IncludeCollection { CoreIncludes.RaytracingCorePregraph }; + + // We want the generic payload if this is not a gbuffer or a subsurface subshader + includes.Add(CoreIncludes.kRaytracingIntersection, IncludeLocation.Pregraph); + + // We want to have the lighting include if this is an indirect sub-shader, a forward one or the path tracing (and this is not an unlit) + if (supportLighting) + { + includes.Add(CoreIncludes.kLighting, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kLightLoopDef, IncludeLocation.Pregraph); + } + + // Each material has a specific hlsl file that should be included pre-graph and holds the lighting model + includes.Add(CoreIncludes.kPassPlaceholder, IncludeLocation.Pregraph); + // We need to then include the ray tracing missing bits for the lighting models (based on which lighting model) + includes.Add(CoreIncludes.kRaytracingPlaceholder, IncludeLocation.Pregraph); + + includes.Add(CoreIncludes.CoreUtility); + includes.Add(CoreIncludes.kRaytracingCommon, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph); + + // post graph includes + includes.Add(CoreIncludes.kPassPathTracing, IncludeLocation.Postgraph); + + return includes; + } } public static DefineCollection RaytracingPathTracingDefines = new DefineCollection @@ -1037,9 +1175,30 @@ public static PassDescriptor GenerateRaytracingSubsurface() pragmas = CorePragmas.RaytracingBasic, defines = RaytracingSubsurfaceDefines, keywords = CoreKeywords.RaytracingGBufferForward, - includes = CoreIncludes.Raytracing, - requiredFields = new FieldCollection(){ HDFields.ShaderPass.RaytracingSubSurface }, + includes = GenerateIncludes(), }; + + IncludeCollection GenerateIncludes() + { + var includes = new IncludeCollection { CoreIncludes.RaytracingCorePregraph }; + + // We want the sub-surface payload if we are in the subsurface sub shader + includes.Add(CoreIncludes.kRaytracingIntersectionSubSurface, IncludeLocation.Pregraph); + + // Each material has a specific hlsl file that should be included pre-graph and holds the lighting model + includes.Add(CoreIncludes.kPassPlaceholder, IncludeLocation.Pregraph); + // We need to then include the ray tracing missing bits for the lighting models (based on which lighting model) + includes.Add(CoreIncludes.kRaytracingPlaceholder, IncludeLocation.Pregraph); + + includes.Add(CoreIncludes.CoreUtility); + includes.Add(CoreIncludes.kRaytracingCommon, IncludeLocation.Pregraph); + includes.Add(CoreIncludes.kShaderGraphFunctions, IncludeLocation.Pregraph); + + // post graph includes + includes.Add(CoreIncludes.kPassRaytracingSubSurface, IncludeLocation.Postgraph); + + return includes; + } } public static DefineCollection RaytracingSubsurfaceDefines = new DefineCollection diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs index 24bbb36b9e7..b3cea2344a4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/HDTarget.cs @@ -825,7 +825,7 @@ static class CoreKeywords { CoreKeywordDescriptors.LodFadeCrossfade, new FieldCondition(Fields.LodCrossFade, true) }, { CoreKeywordDescriptors.SurfaceTypeTransparent }, { CoreKeywordDescriptors.BlendMode }, - { CoreKeywordDescriptors.DoubleSided, new FieldCondition(HDFields.SubShader.Unlit, false) }, + { CoreKeywordDescriptors.DoubleSided, new FieldCondition(HDFields.Unlit, false) }, { CoreKeywordDescriptors.FogOnTransparent }, { CoreKeywordDescriptors.AlphaTest, new FieldCondition(Fields.AlphaTest, true) }, }; @@ -834,7 +834,7 @@ static class CoreKeywords { { CoreKeywordDescriptors.SurfaceTypeTransparent }, { CoreKeywordDescriptors.BlendMode }, - { CoreKeywordDescriptors.DoubleSided, new FieldCondition(HDFields.SubShader.Unlit, false) }, + { CoreKeywordDescriptors.DoubleSided, new FieldCondition(HDFields.Unlit, false) }, { CoreKeywordDescriptors.FogOnTransparent }, { CoreKeywordDescriptors.AlphaTest, new FieldCondition(Fields.AlphaTest, true) }, }; @@ -933,41 +933,41 @@ static class CoreDefines static class CoreIncludes { // CorePregraph - const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; - const string kTextureStack = "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"; - const string kShaderVariables = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"; - const string kFragInputs = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl"; - const string kShaderPass = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"; - const string kMaterial = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl"; - const string kDebugDisplay = "Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl"; + public const string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; + public const string kTextureStack = "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"; + public const string kShaderVariables = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderVariables.hlsl"; + public const string kFragInputs = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/FragInputs.hlsl"; + public const string kShaderPass = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPass.cs.hlsl"; + public const string kMaterial = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Material.hlsl"; + public const string kDebugDisplay = "Packages/com.unity.render-pipelines.high-definition/Runtime/Debug/DebugDisplay.hlsl"; // CoreUtility - const string kBuiltInUtilities = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl"; - const string kMaterialUtilities = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl"; + public const string kBuiltInUtilities = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/BuiltinUtilities.hlsl"; + public const string kMaterialUtilities = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/MaterialUtilities.hlsl"; // Pregraph Raytracing - const string kRaytracingMacros = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingMacros.hlsl"; - const string kShaderVariablesRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/ShaderVariablesRaytracing.hlsl"; - const string kShaderVariablesRaytracingLightLoop = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/ShaderVariablesRaytracingLightLoop.hlsl"; - const string kRaytracingIntersection = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingIntersection.hlsl"; - const string kRaytracingIntersectionGBuffer = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Deferred/RaytracingIntersectonGBuffer.hlsl"; - const string kRaytracingIntersectionSubSurface = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/SubSurface/RayTracingIntersectionSubSurface.hlsl"; - const string kLitRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitRaytracing.hlsl"; - const string kUnlitRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Unlit/UnlitRaytracing.hlsl"; - const string kFabricRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fabric/FabricRaytracing.hlsl"; - const string kStackLitRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/StackLit/StackLitRaytracing.hlsl"; - const string kHairRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Hair/HairRaytracing.hlsl"; - const string kRaytracingLightLoop = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingLightLoop.hlsl"; - const string kRaytracingCommon = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingCommon.hlsl"; - const string kNormalBuffer = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl"; + public const string kRaytracingMacros = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingMacros.hlsl"; + public const string kShaderVariablesRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/ShaderVariablesRaytracing.hlsl"; + public const string kShaderVariablesRaytracingLightLoop = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/ShaderVariablesRaytracingLightLoop.hlsl"; + public const string kRaytracingIntersection = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingIntersection.hlsl"; + public const string kRaytracingIntersectionGBuffer = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/Deferred/RaytracingIntersectonGBuffer.hlsl"; + public const string kRaytracingIntersectionSubSurface = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/SubSurface/RayTracingIntersectionSubSurface.hlsl"; + public const string kLitRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitRaytracing.hlsl"; + public const string kUnlitRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Unlit/UnlitRaytracing.hlsl"; + public const string kFabricRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fabric/FabricRaytracing.hlsl"; + public const string kStackLitRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/StackLit/StackLitRaytracing.hlsl"; + public const string kHairRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Hair/HairRaytracing.hlsl"; + public const string kRaytracingLightLoop = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingLightLoop.hlsl"; + public const string kRaytracingCommon = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RaytracingCommon.hlsl"; + public const string kNormalBuffer = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/NormalBuffer.hlsl"; // Postgraph Raytracing - const string kPassRaytracingIndirect = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassRaytracingIndirect.hlsl"; - const string kPassRaytracingVisbility = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassRaytracingVisibility.hlsl"; - const string kPassRaytracingForward = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassRaytracingForward.hlsl"; - const string kPassRaytracingGBuffer = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderpassRaytracingGBuffer.hlsl"; - const string kPassPathTracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassPathTracing.hlsl"; - const string kPassRaytracingSubSurface = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderpassRaytracingSubSurface.hlsl"; + public const string kPassRaytracingIndirect = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassRaytracingIndirect.hlsl"; + public const string kPassRaytracingVisbility = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassRaytracingVisibility.hlsl"; + public const string kPassRaytracingForward = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassRaytracingForward.hlsl"; + public const string kPassRaytracingGBuffer = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderpassRaytracingGBuffer.hlsl"; + public const string kPassPathTracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassPathTracing.hlsl"; + public const string kPassRaytracingSubSurface = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderpassRaytracingSubSurface.hlsl"; // Public Pregraph Function public const string kCommonLighting = "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonLighting.hlsl"; @@ -991,6 +991,7 @@ static class CoreIncludes public const string kDecalUtilities = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Decal/DecalUtilities.hlsl"; public const string kPassPlaceholder = "Pass Include Placeholder, replace me !"; public const string kPostDecalsPlaceholder = "After Decal Include Placeholder, replace me !"; + public const string kRaytracingPlaceholder = "Raytracing Include Placeholder, replace me !"; // Public Postgraph Pass public const string kPassLightTransport = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassLightTransport.hlsl"; @@ -1014,95 +1015,26 @@ static class CoreIncludes { kMaterial, IncludeLocation.Pregraph }, }; - public static IncludeCollection CoreUtility = new IncludeCollection - { - { kBuiltInUtilities, IncludeLocation.Pregraph }, - { kMaterialUtilities, IncludeLocation.Pregraph }, - }; - - public static IncludeCollection Raytracing = new IncludeCollection + public static IncludeCollection RaytracingCorePregraph = new IncludeCollection { // Pregraph includes - { kCommon, IncludeLocation.Pregraph }, - { kTextureStack, IncludeLocation.Pregraph }, - { kFragInputs, IncludeLocation.Pregraph }, - { kShaderPass, IncludeLocation.Pregraph }, + { CoreIncludes.kCommon, IncludeLocation.Pregraph }, + { CoreIncludes.kTextureStack, IncludeLocation.Pregraph }, + { CoreIncludes.kFragInputs, IncludeLocation.Pregraph }, + { CoreIncludes.kShaderPass, IncludeLocation.Pregraph }, // Ray Tracing macros should be included before shader variables to guarantee that the macros are overriden - { kRaytracingMacros, IncludeLocation.Pregraph }, - { kShaderVariables, IncludeLocation.Pregraph }, - { kMaterial, IncludeLocation.Pregraph }, - { kShaderVariablesRaytracing, IncludeLocation.Pregraph }, - { kShaderVariablesRaytracingLightLoop, IncludeLocation.Pregraph }, - - // We want the gbuffer payload only if we are in the gbuffer pass - { kRaytracingIntersectionGBuffer, IncludeLocation.Pregraph, new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, true)}, - - // We want the sub-surface payload if we are in the subsurface sub shader and this not an unlit - { kRaytracingIntersectionSubSurface, IncludeLocation.Pregraph, new FieldCondition[]{ - new FieldCondition(HDFields.ShaderPass.RaytracingSubSurface, true), - new FieldCondition(HDFields.SubShader.Unlit, false) }}, - - // We want the generic payload if this is not a gbuffer or a subsurface subshader - { kRaytracingIntersection, IncludeLocation.Pregraph, new FieldCondition[]{ - new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, false), - new FieldCondition(HDFields.ShaderPass.RaytracingSubSurface, false) }}, - - // We want to have the lighting include if this is an indirect sub-shader, a forward one or the path tracing (and this is not an unlit) - { kLighting, IncludeLocation.Pregraph, new FieldCondition[]{ - new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, false), - new FieldCondition(HDFields.ShaderPass.RaytracingVisibility, false), - new FieldCondition(HDFields.ShaderPass.RaytracingSubSurface, false), - new FieldCondition(HDFields.SubShader.Unlit, false) }}, - { kLightLoopDef, IncludeLocation.Pregraph, new FieldCondition[]{ - new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, false), - new FieldCondition(HDFields.ShaderPass.RaytracingVisibility, false), - new FieldCondition(HDFields.ShaderPass.RaytracingSubSurface, false), - new FieldCondition(HDFields.SubShader.Unlit, false) }}, - - // Each material has a specific hlsl file that should be included pre-graph and holds the lighting model - { kLit, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Lit, true)}, - { kFabric, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Fabric, true)}, - { kUnlit, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Unlit, true )}, - { kStackLit, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.StackLit, true )}, - { kHair, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Hair, true )}, - - // We want to have the normal buffer include if this is a gbuffer and unlit shader - { kNormalBuffer, IncludeLocation.Pregraph, new FieldCondition[]{ - new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, true), - new FieldCondition(HDFields.SubShader.Unlit, true) }}, - - // If this is the gbuffer sub-shader, we want the standard lit data - { kStandardLit, IncludeLocation.Pregraph, - new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, true)}, - - // We need to then include the ray tracing missing bits for the lighting models (based on which lighting model) - { kLitRaytracing, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Lit, true)}, - { kFabricRaytracing, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Fabric, true)}, - { kStackLitRaytracing, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.StackLit, true)}, - { kUnlitRaytracing, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Unlit, true )}, - { kHairRaytracing, IncludeLocation.Pregraph, new FieldCondition(HDFields.SubShader.Hair, true )}, - - // We want to have the ray tracing light loop if this is an indirect sub-shader or a forward one and it is not the unlit shader - { kRaytracingLightLoop, IncludeLocation.Pregraph, new FieldCondition[]{ - new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, false), - new FieldCondition(HDFields.ShaderPass.RaytracingVisibility, false), - new FieldCondition(HDFields.ShaderPass.RaytracingSubSurface, false), - new FieldCondition(HDFields.ShaderPass.RaytracingPathTracing, false), - new FieldCondition(HDFields.SubShader.Unlit, false) }}, - - { CoreUtility }, - { kRaytracingCommon, IncludeLocation.Pregraph }, - { kShaderGraphFunctions, IncludeLocation.Pregraph }, - - // post graph includes - // The shader passes should always be post graph and are a 1 to 1 mapping to the shader pass name - { kPassRaytracingIndirect, IncludeLocation.Postgraph, new FieldCondition(HDFields.ShaderPass.RaytracingIndirect, true) }, - { kPassRaytracingVisbility, IncludeLocation.Postgraph, new FieldCondition(HDFields.ShaderPass.RaytracingVisibility, true) }, - { kPassRaytracingForward, IncludeLocation.Postgraph, new FieldCondition(HDFields.ShaderPass.RaytracingForward, true) }, - { kPassRaytracingGBuffer, IncludeLocation.Postgraph, new FieldCondition(HDFields.ShaderPass.RayTracingGBuffer, true) }, - { kPassPathTracing, IncludeLocation.Postgraph, new FieldCondition(HDFields.ShaderPass.RaytracingPathTracing, true) }, - { kPassRaytracingSubSurface, IncludeLocation.Postgraph, new FieldCondition(HDFields.ShaderPass.RaytracingSubSurface, true) } + { CoreIncludes.kRaytracingMacros, IncludeLocation.Pregraph }, + { CoreIncludes.kShaderVariables, IncludeLocation.Pregraph }, + { CoreIncludes.kMaterial, IncludeLocation.Pregraph }, + { CoreIncludes.kShaderVariablesRaytracing, IncludeLocation.Pregraph }, + { CoreIncludes.kShaderVariablesRaytracingLightLoop, IncludeLocation.Pregraph }, + }; + + public static IncludeCollection CoreUtility = new IncludeCollection + { + { kBuiltInUtilities, IncludeLocation.Pregraph }, + { kMaterialUtilities, IncludeLocation.Pregraph }, }; } #endregion diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/LightingSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/LightingSubTarget.cs index 987b301904c..b94a70682a4 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/LightingSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/LightingSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -72,26 +73,26 @@ public override void GetFields(ref TargetFieldContext context) var descs = context.blocks.Select(x => x.descriptor); // Misc - context.AddField(HDFields.BlendPreserveSpecular, systemData.surfaceType != SurfaceType.Opaque && lightingData.blendPreserveSpecular); - context.AddField(HDFields.DisableDecals, !lightingData.receiveDecals); - context.AddField(HDFields.DisableSSR, !lightingData.receiveSSR); - context.AddField(HDFields.DisableSSRTransparent, !lightingData.receiveSSRTransparent); - context.AddField(HDFields.SpecularAA, lightingData.specularAA && + context.AddField(BlendPreserveSpecular, systemData.surfaceType != SurfaceType.Opaque && lightingData.blendPreserveSpecular); + context.AddField(DisableDecals, !lightingData.receiveDecals); + context.AddField(DisableSSR, !lightingData.receiveSSR); + context.AddField(DisableSSRTransparent, !lightingData.receiveSSRTransparent); + context.AddField(SpecularAA, lightingData.specularAA && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAThreshold) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAScreenSpaceVariance)); - context.AddField(HDFields.LightingGI, descs.Contains(HDBlockFields.SurfaceDescription.BakedGI) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.BakedGI)); - context.AddField(HDFields.BackLightingGI, descs.Contains(HDBlockFields.SurfaceDescription.BakedBackGI) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.BakedBackGI)); - context.AddField(HDFields.BentNormal, descs.Contains(HDBlockFields.SurfaceDescription.BentNormal) && context.connectedBlocks.Contains(HDBlockFields.SurfaceDescription.BentNormal) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.BentNormal)); + context.AddField(LightingGI, descs.Contains(HDBlockFields.SurfaceDescription.BakedGI) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.BakedGI)); + context.AddField(BackLightingGI, descs.Contains(HDBlockFields.SurfaceDescription.BakedBackGI) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.BakedBackGI)); + context.AddField(BentNormal, descs.Contains(HDBlockFields.SurfaceDescription.BentNormal) && context.connectedBlocks.Contains(HDBlockFields.SurfaceDescription.BentNormal) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.BentNormal)); context.AddField(HDFields.AmbientOcclusion, context.blocks.Contains((BlockFields.SurfaceDescription.Occlusion, false)) && context.pass.validPixelBlocks.Contains(BlockFields.SurfaceDescription.Occlusion)); // Specular Occlusion Fields - context.AddField(HDFields.SpecularOcclusionFromAO, lightingData.specularOcclusionMode == SpecularOcclusionMode.FromAO); - context.AddField(HDFields.SpecularOcclusionFromAOBentNormal, lightingData.specularOcclusionMode == SpecularOcclusionMode.FromAOAndBentNormal); - context.AddField(HDFields.SpecularOcclusionCustom, lightingData.specularOcclusionMode == SpecularOcclusionMode.Custom); + context.AddField(SpecularOcclusionFromAO, lightingData.specularOcclusionMode == SpecularOcclusionMode.FromAO); + context.AddField(SpecularOcclusionFromAOBentNormal, lightingData.specularOcclusionMode == SpecularOcclusionMode.FromAOAndBentNormal); + context.AddField(SpecularOcclusionCustom, lightingData.specularOcclusionMode == SpecularOcclusionMode.Custom); // Double Sided - context.AddField(HDFields.DoubleSidedFlip, systemData.doubleSidedMode == DoubleSidedMode.FlippedNormals && context.pass.referenceName != "SHADERPASS_MOTION_VECTORS"); - context.AddField(HDFields.DoubleSidedMirror, systemData.doubleSidedMode == DoubleSidedMode.MirroredNormals && context.pass.referenceName != "SHADERPASS_MOTION_VECTORS"); + context.AddField(DoubleSidedFlip, systemData.doubleSidedMode == DoubleSidedMode.FlippedNormals && context.pass.referenceName != "SHADERPASS_MOTION_VECTORS"); + context.AddField(DoubleSidedMirror, systemData.doubleSidedMode == DoubleSidedMode.MirroredNormals && context.pass.referenceName != "SHADERPASS_MOTION_VECTORS"); } public override void GetActiveBlocks(ref TargetActiveBlockContext context) diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/SurfaceSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/SurfaceSubTarget.cs index 4ab715824d0..9f975ef7a3a 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/SurfaceSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/ShaderGraph/SurfaceSubTarget.cs @@ -45,6 +45,7 @@ protected override string renderQueue protected abstract string subShaderInclude { get; } protected virtual string postDecalsInclude => null; + protected virtual string raytracingInclude => null; protected abstract FieldDescriptor subShaderField { get; } public override void Setup(ref TargetSetupContext context) @@ -170,6 +171,8 @@ SubShaderDescriptor PostProcessSubShader(SubShaderDescriptor subShaderDescriptor include.descriptor.value = subShaderInclude; if (include.descriptor.value == CoreIncludes.kPostDecalsPlaceholder) include.descriptor.value = postDecalsInclude; + if (include.descriptor.value == CoreIncludes.kRaytracingPlaceholder) + include.descriptor.value = raytracingInclude; if (!String.IsNullOrEmpty(include.descriptor.value)) finalIncludes.Add(include.descriptor.value, include.descriptor.location, include.fieldConditions); @@ -205,6 +208,10 @@ public override void GetFields(ref TargetFieldContext context) if (supportDistortion) AddDistortionFields(ref context); + // Mark the shader as unlit so we can remove lighting in FieldConditions + if (!supportLighting) + context.AddField(HDFields.Unlit); + // Common properties between all "surface" master nodes (everything except decal right now) context.AddField(HDStructFields.FragInputs.IsFrontFace, systemData.doubleSidedMode != DoubleSidedMode.Disabled && context.pass.referenceName != "SHADERPASS_MOTION_VECTORS"); diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSubTarget.cs index d52d603a4cf..165fd27a47e 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/StackLit/ShaderGraph/StackLitSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -24,7 +25,8 @@ sealed partial class StackLitSubTarget : LightingSubTarget, ILegacyTarget, IRequ protected override string customInspector => "Rendering.HighDefinition.StackLitGUI"; protected override string subTargetAssetGuid => "5f7ba34a143e67647b202a662748dae3"; // StackLitSubTarget.cs protected override ShaderID shaderID => HDShaderUtils.ShaderID.SG_StackLit; - protected override FieldDescriptor subShaderField => HDFields.SubShader.StackLit; + protected override FieldDescriptor subShaderField => new FieldDescriptor(kSubShader, "StackLit SubShader", ""); + protected override string raytracingInclude => CoreIncludes.kStackLitRaytracing; protected override string subShaderInclude => CoreIncludes.kStackLit; protected override bool supportDistortion => true; @@ -44,6 +46,70 @@ public StackLitData stackLitData set => m_StackLitData = value; } + const string kSSSpecularOcclusionBaseMode = "ScreenSpaceSpecularOcclusionBaseMode"; + const string kSSSpecularOcclusionAOConeSize = "ScreenSpaceSpecularOcclusionAOConeSize"; + const string kSSSpecularOcclusionAOConeDir = "ScreenSpaceSpecularOcclusionAOConeDir"; + const string kDataBasedSpecularOcclusionBaseMode = "DataBasedSpecularOcclusionBaseMode"; + const string kDataBasedSpecularOcclusionAOConeSize = "DataBasedSpecularOcclusionAOConeSize"; + const string kSpecularOcclusionConeFixupMethod = "SpecularOcclusionConeFixupMethod"; + const string kDualSpecularLobeParametrization = "DualSpecularLobeParametrization"; + const string kBaseParametrization = "BaseParametrization"; + + // Material + public static FieldDescriptor Coat = new FieldDescriptor(kMaterial, "Coat", "_MATERIAL_FEATURE_COAT"); + public static FieldDescriptor DualSpecularLobe = new FieldDescriptor(kMaterial, "DualSpecularLobe", "_MATERIAL_FEATURE_DUAL_SPECULAR_LOBE"); + public static FieldDescriptor CoatNormal = new FieldDescriptor(kMaterial, "CoatNormal", "_MATERIAL_FEATURE_COAT_NORMALMAP"); + + // Advanced + public static FieldDescriptor AnisotropyForAreaLights = new FieldDescriptor(string.Empty, "AnisotropyForAreaLights", "_ANISOTROPY_FOR_AREA_LIGHTS"); + public static FieldDescriptor RecomputeStackPerLight = new FieldDescriptor(string.Empty, "RecomputeStackPerLight", "_VLAYERED_RECOMPUTE_PERLIGHT"); + public static FieldDescriptor HonorPerLightMinRoughness = new FieldDescriptor(string.Empty, "HonorPerLightMinRoughness", "_STACK_LIT_HONORS_LIGHT_MIN_ROUGHNESS"); + public static FieldDescriptor ShadeBaseUsingRefractedAngles = new FieldDescriptor(string.Empty, "ShadeBaseUsingRefractedAngles", "_VLAYERED_USE_REFRACTED_ANGLES_FOR_BASE"); + public static FieldDescriptor StackLitDebug = new FieldDescriptor(string.Empty, "StackLitDebug", "_STACKLIT_DEBUG"); + public static FieldDescriptor CapHazinessIfNotMetallic = new FieldDescriptor(string.Empty, "CapHazinessIfNotMetallic", ""); + public static FieldDescriptor GeometricSpecularAA = new FieldDescriptor(kSpecular, "GeometricAA", "_ENABLE_GEOMETRIC_SPECULAR_AA 1"); + + // Screen Space Specular Occlusion Base Mode + public static FieldDescriptor SSSpecularOcclusionBaseModeOff = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "Off", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_DISABLED"); + public static FieldDescriptor SSSpecularOcclusionBaseModeDirectFromAO = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "DirectFromAO", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_FROM_AO"); + public static FieldDescriptor SSSpecularOcclusionBaseModeConeConeFromBentAO = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "ConeConeFromBentAO", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_CONECONE"); + public static FieldDescriptor SSSpecularOcclusionBaseModeSPTDIntegrationOfBentAO = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "SPTDIntegrationOfBentAO", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_SPTD"); + public static FieldDescriptor SSSpecularOcclusionBaseModeCustom = new FieldDescriptor(kSSSpecularOcclusionBaseMode, "Custom", "_SCREENSPACE_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_FROM_AO"); + + // Screen Space Specular Occlusion AO Cone Size + public static FieldDescriptor SSSpecularOcclusionAOConeSizeUniformAO = new FieldDescriptor(kSSSpecularOcclusionAOConeSize, "UniformAO", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_UNIFORM"); + public static FieldDescriptor SSSpecularOcclusionAOConeSizeCosWeightedAO = new FieldDescriptor(kSSSpecularOcclusionAOConeSize, "CosWeightedAO", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS"); + public static FieldDescriptor SSSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO = new FieldDescriptor(kSSSpecularOcclusionAOConeSize, "CosWeightedBentCorrectAO", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS_BENT_CORRECTION"); + + // Screen Space Specular Occlusion AO Cone Dir + public static FieldDescriptor SSSpecularOcclusionAOConeDirGeomNormal = new FieldDescriptor(kSSSpecularOcclusionAOConeDir, "GeomNormal", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_DIR BENT_VISIBILITY_DIR_GEOM_NORMAL"); + public static FieldDescriptor SSSpecularOcclusionAOConeDirBentNormal = new FieldDescriptor(kSSSpecularOcclusionAOConeDir, "BentNormal", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_DIR BENT_VISIBILITY_DIR_BENT_NORMAL"); + public static FieldDescriptor SSSpecularOcclusionAOConeDirShadingNormal = new FieldDescriptor(kSSSpecularOcclusionAOConeDir, "ShadingNormal", "_SCREENSPACE_SPECULAROCCLUSION_VISIBILITY_DIR BENT_VISIBILITY_DIR_SHADING_NORMAL"); + + // Data Bases Specular Occlusion Base Mode + public static FieldDescriptor DataBasedSpecularOcclusionBaseModeOff = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "Off", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_DISABLED"); + public static FieldDescriptor DataBasedSpecularOcclusionBaseModeDirectFromAO = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "DirectFromAO", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_FROM_AO"); + public static FieldDescriptor DataBasedSpecularOcclusionBaseModeConeConeFromBentAO = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "ConeConeFromBentAO", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_CONECONE"); + public static FieldDescriptor DataBasedSpecularOcclusionBaseModeSPTDIntegrationOfBentAO = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "SPTDIntegrationOfBentAO", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_SPTD"); + public static FieldDescriptor DataBasedSpecularOcclusionBaseModeCustom = new FieldDescriptor(kDataBasedSpecularOcclusionBaseMode, "Custom", "_DATABASED_SPECULAROCCLUSION_METHOD SPECULAR_OCCLUSION_CUSTOM_EXT_INPUT"); + + // Data Based Specular Occlusion AO Cone Size + public static FieldDescriptor DataBasedSpecularOcclusionAOConeSizeUniformAO = new FieldDescriptor(kDataBasedSpecularOcclusionAOConeSize, "UniformAO", "_DATABASED_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_UNIFORM"); + public static FieldDescriptor DataBasedSpecularOcclusionAOConeSizeCosWeightedAO = new FieldDescriptor(kDataBasedSpecularOcclusionAOConeSize, "CosWeightedAO", "_DATABASED_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS"); + public static FieldDescriptor DataBasedSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO = new FieldDescriptor(kDataBasedSpecularOcclusionAOConeSize, "CosWeightedBentCorrectAO", "_DATABASED_SPECULAROCCLUSION_VISIBILITY_FROM_AO_WEIGHT BENT_VISIBILITY_FROM_AO_COS_BENT_CORRECTION"); + + // Specular Occlusion Cone Fixup Method + public static FieldDescriptor SpecularOcclusionConeFixupMethodOff = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "Off", "_BENT_VISIBILITY_FIXUP_FLAGS BENT_VISIBILITY_FIXUP_FLAGS_NONE"); + public static FieldDescriptor SpecularOcclusionConeFixupMethodBoostBSDFRoughness = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "BoostBSDFRoughness", "_BENT_VISIBILITY_FIXUP_FLAGS BENT_VISIBILITY_FIXUP_FLAGS_BOOST_BSDF_ROUGHNESS"); + public static FieldDescriptor SpecularOcclusionConeFixupMethodTiltDirectionToGeomNormal = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "TiltDirectionToGeomNormal", "_BENT_VISIBILITY_FIXUP_FLAGS BENT_VISIBILITY_FIXUP_FLAGS_TILT_BENTNORMAL_TO_GEOM"); + public static FieldDescriptor SpecularOcclusionConeFixupMethodBoostAndTilt = new FieldDescriptor(kSpecularOcclusionConeFixupMethod, "BoostAndTilt", "_BENT_VISIBILITY_FIXUP_FLAGS (BENT_VISIBILITY_FIXUP_FLAGS_BOOST_BSDF_ROUGHNESS|BENT_VISIBILITY_FIXUP_FLAGS_TILT_BENTNORMAL_TO_GEOM)"); + + // Dual Specular Lobe Parametrization + public static FieldDescriptor HazyGloss = new FieldDescriptor(kDualSpecularLobeParametrization, "HazyGloss", "_MATERIAL_FEATURE_HAZY_GLOSS"); + + // Base Parametrization + public static FieldDescriptor BaseParamSpecularColor = new FieldDescriptor(kBaseParametrization, "SpecularColor", "_MATERIAL_FEATURE_SPECULAR_COLOR"); + protected override SubShaderDescriptor GetRaytracingSubShaderDescriptor() { var descriptor = base.GetRaytracingSubShaderDescriptor(); @@ -62,41 +128,41 @@ public override void GetFields(ref TargetFieldContext context) // StackLit specific properties // Material - context.AddField(HDFields.Anisotropy, stackLitData.anisotropy); - context.AddField(HDFields.Coat, stackLitData.coat); - context.AddField(HDFields.CoatMask, stackLitData.coat && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.CoatMask) && + context.AddField(Anisotropy, stackLitData.anisotropy); + context.AddField(Coat, stackLitData.coat); + context.AddField(CoatMask, stackLitData.coat && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.CoatMask) && descs.Contains(HDBlockFields.SurfaceDescription.CoatMask)); - // context.AddField(HDFields.CoatMaskZero, coat.isOn && pass.pixelBlocks.Contains(CoatMaskSlotId) && + // context.AddField(CoatMaskZero, coat.isOn && pass.pixelBlocks.Contains(CoatMaskSlotId) && // FindSlot(CoatMaskSlotId).value == 0.0f), - // context.AddField(HDFields.CoatMaskOne, coat.isOn && pass.pixelBlocks.Contains(CoatMaskSlotId) && + // context.AddField(CoatMaskOne, coat.isOn && pass.pixelBlocks.Contains(CoatMaskSlotId) && // FindSlot(CoatMaskSlotId).value == 1.0f), - context.AddField(HDFields.CoatNormal, stackLitData.coatNormal + context.AddField(CoatNormal, stackLitData.coatNormal && (context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.CoatNormalOS) || context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.CoatNormalTS) || context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.CoatNormalWS))); - context.AddField(HDFields.Iridescence, stackLitData.iridescence); - context.AddField(HDFields.SubsurfaceScattering, stackLitData.subsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); - context.AddField(HDFields.Transmission, stackLitData.transmission); - context.AddField(HDFields.DualSpecularLobe, stackLitData.dualSpecularLobe); + context.AddField(Iridescence, stackLitData.iridescence); + context.AddField(SubsurfaceScattering, stackLitData.subsurfaceScattering && systemData.surfaceType != SurfaceType.Transparent); + context.AddField(Transmission, stackLitData.transmission); + context.AddField(DualSpecularLobe, stackLitData.dualSpecularLobe); // Base Parametrization // Even though we can just always transfer the present (check with $SurfaceDescription.*) fields like specularcolor // and metallic, we still need to know the baseParametrization in the template to translate into the // _MATERIAL_FEATURE_SPECULAR_COLOR define: - context.AddField(HDFields.BaseParamSpecularColor, stackLitData.baseParametrization == StackLit.BaseParametrization.SpecularColor); + context.AddField(BaseParamSpecularColor, stackLitData.baseParametrization == StackLit.BaseParametrization.SpecularColor); // Dual Specular Lobe Parametrization - context.AddField(HDFields.HazyGloss, stackLitData.dualSpecularLobe && + context.AddField(HazyGloss, stackLitData.dualSpecularLobe && stackLitData.dualSpecularLobeParametrization == StackLit.DualSpecularLobeParametrization.HazyGloss); // Misc - context.AddField(HDFields.EnergyConservingSpecular, stackLitData.energyConservingSpecular); - context.AddField(HDFields.Tangent, descs.Contains(HDBlockFields.SurfaceDescription.Tangent) && + context.AddField(EnergyConservingSpecular, stackLitData.energyConservingSpecular); + context.AddField(Tangent, descs.Contains(HDBlockFields.SurfaceDescription.Tangent) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.Tangent)); // Option for baseParametrization == Metallic && DualSpecularLobeParametrization == HazyGloss: // Again we assume masternode has HazyGlossMaxDielectricF0 which should always be the case // if capHazinessWrtMetallic.isOn. - context.AddField(HDFields.CapHazinessIfNotMetallic, stackLitData.dualSpecularLobe && + context.AddField(CapHazinessIfNotMetallic, stackLitData.dualSpecularLobe && stackLitData.dualSpecularLobeParametrization == StackLit.DualSpecularLobeParametrization.HazyGloss && stackLitData.capHazinessWrtMetallic && stackLitData.baseParametrization == StackLit.BaseParametrization.BaseMetallic && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.HazyGlossMaxDielectricF0)); @@ -117,68 +183,68 @@ public override void GetFields(ref TargetFieldContext context) // // (Note we can achieve the same results in the template on just single predicates by making defines out of them, // and using #if defined() && etc) - context.AddField(HDFields.GeometricSpecularAA, lightingData.specularAA && + context.AddField(GeometricSpecularAA, lightingData.specularAA && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAScreenSpaceVariance) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAThreshold)); - context.AddField(HDFields.SpecularAA, lightingData.specularAA && + context.AddField(SpecularAA, lightingData.specularAA && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAScreenSpaceVariance) && context.pass.validPixelBlocks.Contains(HDBlockFields.SurfaceDescription.SpecularAAThreshold)); - context.AddField(HDFields.SpecularOcclusion, stackLitData.screenSpaceSpecularOcclusionBaseMode != StackLitData.SpecularOcclusionBaseMode.Off || + context.AddField(SpecularOcclusion, stackLitData.screenSpaceSpecularOcclusionBaseMode != StackLitData.SpecularOcclusionBaseMode.Off || stackLitData.dataBasedSpecularOcclusionBaseMode != StackLitData.SpecularOcclusionBaseMode.Off); // Advanced - context.AddField(HDFields.AnisotropyForAreaLights, stackLitData.anisotropyForAreaLights); - context.AddField(HDFields.RecomputeStackPerLight, stackLitData.recomputeStackPerLight); - context.AddField(HDFields.HonorPerLightMinRoughness, stackLitData.honorPerLightMinRoughness); - context.AddField(HDFields.ShadeBaseUsingRefractedAngles, stackLitData.shadeBaseUsingRefractedAngles); - context.AddField(HDFields.StackLitDebug, stackLitData.debug); + context.AddField(AnisotropyForAreaLights, stackLitData.anisotropyForAreaLights); + context.AddField(RecomputeStackPerLight, stackLitData.recomputeStackPerLight); + context.AddField(HonorPerLightMinRoughness, stackLitData.honorPerLightMinRoughness); + context.AddField(ShadeBaseUsingRefractedAngles, stackLitData.shadeBaseUsingRefractedAngles); + context.AddField(StackLitDebug, stackLitData.debug); // Screen Space Specular Occlusion Base Mode - context.AddField(HDFields.SSSpecularOcclusionBaseModeOff, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Off); - context.AddField(HDFields.SSSpecularOcclusionBaseModeDirectFromAO, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.DirectFromAO); - context.AddField(HDFields.SSSpecularOcclusionBaseModeConeConeFromBentAO, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.ConeConeFromBentAO); - context.AddField(HDFields.SSSpecularOcclusionBaseModeSPTDIntegrationOfBentAO, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.SPTDIntegrationOfBentAO); - context.AddField(HDFields.SSSpecularOcclusionBaseModeCustom, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Custom); + context.AddField(SSSpecularOcclusionBaseModeOff, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Off); + context.AddField(SSSpecularOcclusionBaseModeDirectFromAO, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.DirectFromAO); + context.AddField(SSSpecularOcclusionBaseModeConeConeFromBentAO, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.ConeConeFromBentAO); + context.AddField(SSSpecularOcclusionBaseModeSPTDIntegrationOfBentAO, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.SPTDIntegrationOfBentAO); + context.AddField(SSSpecularOcclusionBaseModeCustom, stackLitData.screenSpaceSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Custom); // Screen Space Specular Occlusion AO Cone Size - context.AddField(HDFields.SSSpecularOcclusionAOConeSizeUniformAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && + context.AddField(SSSpecularOcclusionAOConeSizeUniformAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && stackLitData.screenSpaceSpecularOcclusionAOConeSize == StackLitData.SpecularOcclusionAOConeSize.UniformAO); - context.AddField(HDFields.SSSpecularOcclusionAOConeSizeCosWeightedAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && + context.AddField(SSSpecularOcclusionAOConeSizeCosWeightedAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && stackLitData.screenSpaceSpecularOcclusionAOConeSize == StackLitData.SpecularOcclusionAOConeSize.CosWeightedAO); - context.AddField(HDFields.SSSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && + context.AddField(SSSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && stackLitData.screenSpaceSpecularOcclusionAOConeSize == StackLitData.SpecularOcclusionAOConeSize.CosWeightedBentCorrectAO); // Screen Space Specular Occlusion AO Cone Dir - context.AddField(HDFields.SSSpecularOcclusionAOConeDirGeomNormal, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && + context.AddField(SSSpecularOcclusionAOConeDirGeomNormal, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && stackLitData.screenSpaceSpecularOcclusionAOConeDir == StackLitData.SpecularOcclusionAOConeDir.GeomNormal); - context.AddField(HDFields.SSSpecularOcclusionAOConeDirBentNormal, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && + context.AddField(SSSpecularOcclusionAOConeDirBentNormal, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && stackLitData.screenSpaceSpecularOcclusionAOConeDir == StackLitData.SpecularOcclusionAOConeDir.BentNormal); - context.AddField(HDFields.SSSpecularOcclusionAOConeDirShadingNormal, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && + context.AddField(SSSpecularOcclusionAOConeDirShadingNormal, SpecularOcclusionModeUsesVisibilityCone(stackLitData.screenSpaceSpecularOcclusionBaseMode) && stackLitData.screenSpaceSpecularOcclusionAOConeDir == StackLitData.SpecularOcclusionAOConeDir.ShadingNormal); // Data Based Specular Occlusion Base Mode - context.AddField(HDFields.DataBasedSpecularOcclusionBaseModeOff, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Off); - context.AddField(HDFields.DataBasedSpecularOcclusionBaseModeDirectFromAO, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.DirectFromAO); - context.AddField(HDFields.DataBasedSpecularOcclusionBaseModeConeConeFromBentAO, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.ConeConeFromBentAO); - context.AddField(HDFields.DataBasedSpecularOcclusionBaseModeSPTDIntegrationOfBentAO, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.SPTDIntegrationOfBentAO); - context.AddField(HDFields.DataBasedSpecularOcclusionBaseModeCustom, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Custom); + context.AddField(DataBasedSpecularOcclusionBaseModeOff, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Off); + context.AddField(DataBasedSpecularOcclusionBaseModeDirectFromAO, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.DirectFromAO); + context.AddField(DataBasedSpecularOcclusionBaseModeConeConeFromBentAO, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.ConeConeFromBentAO); + context.AddField(DataBasedSpecularOcclusionBaseModeSPTDIntegrationOfBentAO, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.SPTDIntegrationOfBentAO); + context.AddField(DataBasedSpecularOcclusionBaseModeCustom, stackLitData.dataBasedSpecularOcclusionBaseMode == StackLitData.SpecularOcclusionBaseMode.Custom); // Data Based Specular Occlusion AO Cone Size - context.AddField(HDFields.DataBasedSpecularOcclusionAOConeSizeUniformAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.dataBasedSpecularOcclusionBaseMode) && + context.AddField(DataBasedSpecularOcclusionAOConeSizeUniformAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.dataBasedSpecularOcclusionBaseMode) && stackLitData.dataBasedSpecularOcclusionAOConeSize == StackLitData.SpecularOcclusionAOConeSize.UniformAO); - context.AddField(HDFields.DataBasedSpecularOcclusionAOConeSizeCosWeightedAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.dataBasedSpecularOcclusionBaseMode) && + context.AddField(DataBasedSpecularOcclusionAOConeSizeCosWeightedAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.dataBasedSpecularOcclusionBaseMode) && stackLitData.dataBasedSpecularOcclusionAOConeSize == StackLitData.SpecularOcclusionAOConeSize.CosWeightedAO); - context.AddField(HDFields.DataBasedSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.dataBasedSpecularOcclusionBaseMode) && + context.AddField(DataBasedSpecularOcclusionAOConeSizeCosWeightedBentCorrectAO, SpecularOcclusionModeUsesVisibilityCone(stackLitData.dataBasedSpecularOcclusionBaseMode) && stackLitData.dataBasedSpecularOcclusionAOConeSize == StackLitData.SpecularOcclusionAOConeSize.CosWeightedBentCorrectAO); // Specular Occlusion Cone Fixup Method - context.AddField(HDFields.SpecularOcclusionConeFixupMethodOff, SpecularOcclusionUsesBentNormal(stackLitData) && + context.AddField(SpecularOcclusionConeFixupMethodOff, SpecularOcclusionUsesBentNormal(stackLitData) && stackLitData.specularOcclusionConeFixupMethod == StackLitData.SpecularOcclusionConeFixupMethod.Off); - context.AddField(HDFields.SpecularOcclusionConeFixupMethodBoostBSDFRoughness, SpecularOcclusionUsesBentNormal(stackLitData) && + context.AddField(SpecularOcclusionConeFixupMethodBoostBSDFRoughness, SpecularOcclusionUsesBentNormal(stackLitData) && stackLitData.specularOcclusionConeFixupMethod == StackLitData.SpecularOcclusionConeFixupMethod.BoostBSDFRoughness); - context.AddField(HDFields.SpecularOcclusionConeFixupMethodTiltDirectionToGeomNormal, SpecularOcclusionUsesBentNormal(stackLitData) && + context.AddField(SpecularOcclusionConeFixupMethodTiltDirectionToGeomNormal, SpecularOcclusionUsesBentNormal(stackLitData) && stackLitData.specularOcclusionConeFixupMethod == StackLitData.SpecularOcclusionConeFixupMethod.TiltDirectionToGeomNormal); - context.AddField(HDFields.SpecularOcclusionConeFixupMethodBoostAndTilt, SpecularOcclusionUsesBentNormal(stackLitData) && + context.AddField(SpecularOcclusionConeFixupMethodBoostAndTilt, SpecularOcclusionUsesBentNormal(stackLitData) && stackLitData.specularOcclusionConeFixupMethod == StackLitData.SpecularOcclusionConeFixupMethod.BoostAndTilt); } diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitDistortionPropertyBlock.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitDistortionPropertyBlock.cs index fbc86bfcb56..badd39fbf27 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitDistortionPropertyBlock.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitDistortionPropertyBlock.cs @@ -23,7 +23,6 @@ protected override void CreatePropertyGUI() base.CreatePropertyGUI(); if (builtinData.distortion) AddProperty(distortionOnlyText, () => unlitData.distortionOnly, (newValue) => unlitData.distortionOnly = newValue, 1); - base.CreatePropertyGUI(); } } } \ No newline at end of file diff --git a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSubTarget.cs b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSubTarget.cs index 951e9aecc4f..5a6cb094238 100644 --- a/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSubTarget.cs +++ b/com.unity.render-pipelines.high-definition/Editor/Material/Unlit/ShaderGraph/HDUnlitSubTarget.cs @@ -10,6 +10,7 @@ using UnityEditor.Rendering.HighDefinition.ShaderGraph.Legacy; using static UnityEngine.Rendering.HighDefinition.HDMaterialProperties; using static UnityEditor.Rendering.HighDefinition.HDShaderUtils; +using static UnityEditor.Rendering.HighDefinition.HDFields; namespace UnityEditor.Rendering.HighDefinition.ShaderGraph { @@ -23,7 +24,8 @@ sealed partial class HDUnlitSubTarget : SurfaceSubTarget, IRequiresData HDRenderTypeTags.HDUnlitShader.ToString(); protected override string subTargetAssetGuid => "4516595d40fa52047a77940183dc8e74"; // HDUnlitSubTarget protected override string customInspector => "Rendering.HighDefinition.HDUnlitGUI"; - protected override FieldDescriptor subShaderField => HDFields.SubShader.Unlit; + protected override FieldDescriptor subShaderField => new FieldDescriptor(kSubShader, "Unlit SubShader", ""); + protected override string raytracingInclude => CoreIncludes.kUnlitRaytracing; protected override string subShaderInclude => CoreIncludes.kUnlit; protected override bool supportDistortion => true; @@ -44,6 +46,8 @@ public HDUnlitData unlitData set => m_UnlitData = value; } + public static FieldDescriptor EnableShadowMatte = new FieldDescriptor(string.Empty, "EnableShadowMatte", "_ENABLE_SHADOW_MATTE"); + protected override SubShaderDescriptor GetSubShaderDescriptor() { if (unlitData.distortionOnly && builtinData.distortion) @@ -51,7 +55,7 @@ protected override SubShaderDescriptor GetSubShaderDescriptor() return new SubShaderDescriptor { generatesPreview = true, - passes = new PassCollection{ { HDShaderPasses.GenerateDistortionPass(false), new FieldCondition(HDFields.TransparentDistortion, true) } } + passes = new PassCollection{ { HDShaderPasses.GenerateDistortionPass(false), new FieldCondition(TransparentDistortion, true) } } }; } else @@ -61,10 +65,10 @@ protected override SubShaderDescriptor GetSubShaderDescriptor() // We need to add includes for shadow matte as it's a special case (Lighting includes in an unlit pass) var forwardUnlit = descriptor.passes.FirstOrDefault(p => p.descriptor.lightMode == "ForwardOnly"); - forwardUnlit.descriptor.includes.Add(CoreIncludes.kHDShadow, IncludeLocation.Pregraph, new FieldCondition(HDFields.EnableShadowMatte, true)); - forwardUnlit.descriptor.includes.Add(CoreIncludes.kLightLoopDef, IncludeLocation.Pregraph, new FieldCondition(HDFields.EnableShadowMatte, true)); - forwardUnlit.descriptor.includes.Add(CoreIncludes.kPunctualLightCommon, IncludeLocation.Pregraph, new FieldCondition(HDFields.EnableShadowMatte, true)); - forwardUnlit.descriptor.includes.Add(CoreIncludes.kHDShadowLoop, IncludeLocation.Pregraph, new FieldCondition(HDFields.EnableShadowMatte, true)); + forwardUnlit.descriptor.includes.Add(CoreIncludes.kHDShadow, IncludeLocation.Pregraph, new FieldCondition(EnableShadowMatte, true)); + forwardUnlit.descriptor.includes.Add(CoreIncludes.kLightLoopDef, IncludeLocation.Pregraph, new FieldCondition(EnableShadowMatte, true)); + forwardUnlit.descriptor.includes.Add(CoreIncludes.kPunctualLightCommon, IncludeLocation.Pregraph, new FieldCondition(EnableShadowMatte, true)); + forwardUnlit.descriptor.includes.Add(CoreIncludes.kHDShadowLoop, IncludeLocation.Pregraph, new FieldCondition(EnableShadowMatte, true)); return descriptor; } @@ -75,7 +79,7 @@ public override void GetFields(ref TargetFieldContext context) base.GetFields(ref context); // Unlit specific properties - context.AddField(HDFields.EnableShadowMatte, unlitData.enableShadowMatte); + context.AddField(EnableShadowMatte, unlitData.enableShadowMatte); } public override void GetActiveBlocks(ref TargetActiveBlockContext context)