182 lines
8.7 KiB
C#
182 lines
8.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
using UnityEditor.ShaderGraph;
|
|
using UnityEditor.ShaderGraph.Internal;
|
|
using UnityEditor.Graphing;
|
|
using UnityEditor.ShaderGraph.Legacy;
|
|
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
|
|
{
|
|
abstract class LightingSubTarget : SurfaceSubTarget, IRequiresData<LightingData>
|
|
{
|
|
LightingData m_LightingData;
|
|
|
|
LightingData IRequiresData<LightingData>.data
|
|
{
|
|
get => m_LightingData;
|
|
set => m_LightingData = value;
|
|
}
|
|
|
|
public LightingData lightingData
|
|
{
|
|
get => m_LightingData;
|
|
set => m_LightingData = value;
|
|
}
|
|
|
|
protected override string customInspector => "Rendering.HighDefinition.LightingShaderGraphGUI";
|
|
|
|
protected override string renderQueue
|
|
{
|
|
get => HDRenderQueue.GetShaderTagValue(HDRenderQueue.ChangeType(systemData.renderQueueType, systemData.sortPriority, systemData.alphaTest, lightingData.receiveDecals));
|
|
}
|
|
|
|
protected override string renderType => HDRenderTypeTags.HDLitShader.ToString();
|
|
|
|
static readonly GUID kSourceCodeGuid = new GUID("aea3df556ea7e9b44855d1fff79fed53"); // LightingSubTarget.cs
|
|
|
|
public override void Setup(ref TargetSetupContext context)
|
|
{
|
|
context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency);
|
|
base.Setup(ref context);
|
|
}
|
|
|
|
public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action<String> registerUndo)
|
|
{
|
|
var gui = new SubTargetPropertiesGUI(context, onChange, registerUndo, systemData, builtinData, lightingData);
|
|
AddInspectorPropertyBlocks(gui);
|
|
context.Add(gui);
|
|
}
|
|
|
|
protected override int ComputeMaterialNeedsUpdateHash()
|
|
{
|
|
int hash = base.ComputeMaterialNeedsUpdateHash();
|
|
|
|
unchecked
|
|
{
|
|
hash = hash * 23 + builtinData.alphaTestShadow.GetHashCode();
|
|
hash = hash * 23 + lightingData.receiveSSR.GetHashCode();
|
|
hash = hash * 23 + lightingData.receiveSSRTransparent.GetHashCode();
|
|
}
|
|
|
|
return hash;
|
|
}
|
|
|
|
protected override bool supportLighting => true;
|
|
// All lit sub targets are forward only except Lit so we set it as default here
|
|
protected override bool supportForward => true;
|
|
|
|
protected abstract bool requireSplitLighting { get; }
|
|
|
|
public override void GetFields(ref TargetFieldContext context)
|
|
{
|
|
base.GetFields(ref context);
|
|
|
|
// Common properties to all Lit master nodes
|
|
var descs = context.blocks.Select(x => x.descriptor);
|
|
|
|
// Misc
|
|
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(SpecularOcclusionFromAO, lightingData.specularOcclusionMode == SpecularOcclusionMode.FromAO);
|
|
context.AddField(SpecularOcclusionFromAOBentNormal, lightingData.specularOcclusionMode == SpecularOcclusionMode.FromAOAndBentNormal);
|
|
context.AddField(SpecularOcclusionCustom, lightingData.specularOcclusionMode == SpecularOcclusionMode.Custom);
|
|
|
|
// Double Sided
|
|
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");
|
|
}
|
|
|
|
protected override void CollectPassKeywords(ref PassDescriptor pass)
|
|
{
|
|
base.CollectPassKeywords(ref pass);
|
|
|
|
pass.keywords.Add(CoreKeywordDescriptors.DisableDecals);
|
|
pass.keywords.Add(CoreKeywordDescriptors.DisableSSR);
|
|
pass.keywords.Add(CoreKeywordDescriptors.DisableSSRTransparent);
|
|
// pass.keywords.Add(CoreKeywordDescriptors.EnableGeometricSpecularAA);
|
|
|
|
if (pass.IsDepthOrMV())
|
|
{
|
|
pass.keywords.Add(CoreKeywordDescriptors.WriteDecalBuffer);
|
|
}
|
|
|
|
if (pass.IsLightingOrMaterial())
|
|
{
|
|
pass.keywords.Add(CoreKeywordDescriptors.Lightmap);
|
|
pass.keywords.Add(CoreKeywordDescriptors.DirectionalLightmapCombined);
|
|
|
|
if (!pass.IsDXR())
|
|
{
|
|
pass.keywords.Add(CoreKeywordDescriptors.DynamicLightmap);
|
|
pass.keywords.Add(CoreKeywordDescriptors.ShadowsShadowmask);
|
|
pass.keywords.Add(CoreKeywordDescriptors.Decals);
|
|
}
|
|
}
|
|
|
|
if (pass.IsForward())
|
|
{
|
|
pass.keywords.Add(CoreKeywordDescriptors.Shadow);
|
|
pass.keywords.Add(CoreKeywordDescriptors.ScreenSpaceShadow);
|
|
|
|
if (pass.lightMode == HDShaderPassNames.s_TransparentBackfaceStr)
|
|
pass.defines.Add(CoreKeywordDescriptors.LightList, 1);
|
|
else
|
|
pass.keywords.Add(CoreKeywordDescriptors.LightList);
|
|
}
|
|
}
|
|
|
|
public override void GetActiveBlocks(ref TargetActiveBlockContext context)
|
|
{
|
|
base.GetActiveBlocks(ref context);
|
|
|
|
context.AddBlock(HDBlockFields.SurfaceDescription.BentNormal);
|
|
context.AddBlock(BlockFields.SurfaceDescription.Smoothness);
|
|
context.AddBlock(BlockFields.SurfaceDescription.Occlusion);
|
|
|
|
// Specular AA
|
|
context.AddBlock(HDBlockFields.SurfaceDescription.SpecularAAScreenSpaceVariance, lightingData.specularAA);
|
|
context.AddBlock(HDBlockFields.SurfaceDescription.SpecularAAThreshold, lightingData.specularAA);
|
|
|
|
// Baked GI
|
|
context.AddBlock(HDBlockFields.SurfaceDescription.BakedGI, lightingData.overrideBakedGI);
|
|
context.AddBlock(HDBlockFields.SurfaceDescription.BakedBackGI, lightingData.overrideBakedGI);
|
|
|
|
// Misc
|
|
context.AddBlock(HDBlockFields.SurfaceDescription.SpecularOcclusion, lightingData.specularOcclusionMode == SpecularOcclusionMode.Custom);
|
|
|
|
// Normal dropoff space
|
|
context.AddBlock(BlockFields.SurfaceDescription.NormalOS, lightingData.normalDropOffSpace == NormalDropOffSpace.Object);
|
|
context.AddBlock(BlockFields.SurfaceDescription.NormalTS, lightingData.normalDropOffSpace == NormalDropOffSpace.Tangent);
|
|
context.AddBlock(BlockFields.SurfaceDescription.NormalWS, lightingData.normalDropOffSpace == NormalDropOffSpace.World);
|
|
}
|
|
|
|
public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode)
|
|
{
|
|
base.CollectShaderProperties(collector, generationMode);
|
|
|
|
// Add all shader properties required by the inspector
|
|
HDSubShaderUtilities.AddStencilShaderProperties(collector, systemData, lightingData, requireSplitLighting);
|
|
}
|
|
|
|
public override void ProcessPreviewMaterial(Material material)
|
|
{
|
|
base.ProcessPreviewMaterial(material);
|
|
|
|
material.SetFloat(kEnableBlendModePreserveSpecularLighting, lightingData.blendPreserveSpecular ? 1 : 0);
|
|
material.SetFloat(kReceivesSSR, lightingData.receiveSSR ? 1 : 0);
|
|
material.SetFloat(kReceivesSSRTransparent, lightingData.receiveSSRTransparent ? 1 : 0);
|
|
}
|
|
}
|
|
}
|