You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1966 lines
100 KiB
1966 lines
100 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
using UnityEngine.UIElements;
|
|
using UnityEditor.Graphing;
|
|
using UnityEditor.ShaderGraph;
|
|
using UnityEditor.ShaderGraph.Internal;
|
|
using UnityEditor.UIElements;
|
|
using UnityEditor.ShaderGraph.Serialization;
|
|
using UnityEditor.ShaderGraph.Legacy;
|
|
using UnityEditor.VFX;
|
|
|
|
namespace UnityEditor.Rendering.HighDefinition.ShaderGraph
|
|
{
|
|
enum DistortionMode
|
|
{
|
|
Add,
|
|
Multiply,
|
|
Replace
|
|
}
|
|
|
|
enum DoubleSidedMode
|
|
{
|
|
Disabled,
|
|
Enabled,
|
|
FlippedNormals,
|
|
MirroredNormals,
|
|
}
|
|
|
|
enum DoubleSidedGIMode
|
|
{
|
|
MatchMaterial,
|
|
ForceOn,
|
|
ForceOff,
|
|
}
|
|
|
|
enum SpecularOcclusionMode
|
|
{
|
|
Off,
|
|
FromAO,
|
|
FromAOAndBentNormal,
|
|
Custom
|
|
}
|
|
|
|
sealed class HDTarget : Target, IHasMetadata, ILegacyTarget, IMaySupportVFX, IRequireVFXContext
|
|
{
|
|
// Constants
|
|
static readonly GUID kSourceCodeGuid = new GUID("61d9843d4027e3e4a924953135f76f3c"); // HDTarget.cs
|
|
|
|
// SubTarget
|
|
List<SubTarget> m_SubTargets;
|
|
List<string> m_SubTargetNames;
|
|
int activeSubTargetIndex => m_SubTargets.IndexOf(m_ActiveSubTarget);
|
|
|
|
// View
|
|
PopupField<string> m_SubTargetField;
|
|
TextField m_CustomGUIField;
|
|
Toggle m_SupportVFXToggle;
|
|
Toggle m_SupportLineRenderingToggle;
|
|
|
|
[SerializeField]
|
|
JsonData<SubTarget> m_ActiveSubTarget;
|
|
|
|
public override SubTarget activeSubTarget
|
|
{
|
|
get => m_ActiveSubTarget.value;
|
|
set => m_ActiveSubTarget = value;
|
|
}
|
|
|
|
public bool supportLineRendering
|
|
{
|
|
get => m_SupportLineRendering;
|
|
}
|
|
|
|
[SerializeField]
|
|
List<JsonData<JsonObject>> m_Datas = new List<JsonData<JsonObject>>();
|
|
|
|
[SerializeField]
|
|
string m_CustomEditorGUI;
|
|
|
|
[SerializeField]
|
|
bool m_SupportVFX;
|
|
|
|
[SerializeField]
|
|
bool m_SupportLineRendering;
|
|
|
|
private static readonly List<Type> m_IncompatibleVFXSubTargets = new()
|
|
{
|
|
// Currently there is not support for VFX decals via HDRP master node.
|
|
typeof(DecalSubTarget),
|
|
typeof(TerrainLitSubTarget),
|
|
typeof(HDCanvasSubTarget),
|
|
typeof(HDFullscreenSubTarget),
|
|
typeof(WaterSubTarget),
|
|
typeof(WaterDecalSubTarget),
|
|
typeof(FogVolumeSubTarget),
|
|
typeof(PBRSkySubTarget),
|
|
};
|
|
|
|
private static readonly List<Type> m_IncompatibleHQLineRenderingSubTargets = new()
|
|
{
|
|
typeof(DecalSubTarget),
|
|
typeof(HDCanvasSubTarget),
|
|
typeof(HDFullscreenSubTarget),
|
|
typeof(WaterSubTarget),
|
|
typeof(WaterDecalSubTarget),
|
|
typeof(FogVolumeSubTarget),
|
|
typeof(PBRSkySubTarget),
|
|
};
|
|
|
|
internal override bool ignoreCustomInterpolators => m_ActiveSubTarget.value is HDCanvasSubTarget;
|
|
internal override int padCustomInterpolatorLimit => 8;
|
|
|
|
public override bool IsNodeAllowedByTarget(Type nodeType)
|
|
{
|
|
SRPFilterAttribute srpFilter = NodeClassCache.GetAttributeOnNodeType<SRPFilterAttribute>(nodeType);
|
|
bool worksWithThisSrp = srpFilter == null || srpFilter.srpTypes.Contains(typeof(HDRenderPipeline));
|
|
|
|
SubTargetFilterAttribute subTargetFilter = NodeClassCache.GetAttributeOnNodeType<SubTargetFilterAttribute>(nodeType);
|
|
var activeSubTargetType = activeSubTarget.GetType();
|
|
var worksWithThisSubTarget = subTargetFilter == null;
|
|
if (subTargetFilter != null)
|
|
{
|
|
foreach (var type in subTargetFilter.subTargetTypes)
|
|
{
|
|
if (!type.IsAssignableFrom(activeSubTargetType)) continue;
|
|
worksWithThisSubTarget = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (activeSubTarget.IsActive())
|
|
worksWithThisSubTarget &= activeSubTarget.IsNodeAllowedBySubTarget(nodeType);
|
|
|
|
return worksWithThisSrp && worksWithThisSubTarget && base.IsNodeAllowedByTarget(nodeType);
|
|
}
|
|
|
|
public HDTarget()
|
|
{
|
|
displayName = "HDRP";
|
|
m_SubTargets = TargetUtils.GetSubTargets(this);
|
|
m_SubTargetNames = m_SubTargets.Select(x => x.displayName).ToList();
|
|
|
|
TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets);
|
|
ProcessSubTargetDatas(m_ActiveSubTarget.value);
|
|
}
|
|
|
|
public string customEditorGUI
|
|
{
|
|
get => m_CustomEditorGUI;
|
|
set => m_CustomEditorGUI = value;
|
|
}
|
|
|
|
public override bool IsActive()
|
|
{
|
|
if (m_ActiveSubTarget.value == null)
|
|
return false;
|
|
|
|
bool isHDRenderPipeline = GraphicsSettings.currentRenderPipeline is HDRenderPipelineAsset;
|
|
return isHDRenderPipeline && m_ActiveSubTarget.value.IsActive();
|
|
}
|
|
|
|
public override void Setup(ref TargetSetupContext context)
|
|
{
|
|
// Setup the Target
|
|
context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency);
|
|
|
|
// Process SubTargets
|
|
TargetUtils.ProcessSubTargetList(ref m_ActiveSubTarget, ref m_SubTargets);
|
|
if (m_ActiveSubTarget.value == null)
|
|
return;
|
|
|
|
// Override EditorGUI (replaces the HDRP material editor by a custom one)
|
|
if (!string.IsNullOrEmpty(m_CustomEditorGUI))
|
|
context.AddCustomEditorForRenderPipeline(m_CustomEditorGUI, typeof(HDRenderPipelineAsset));
|
|
|
|
// Setup the active SubTarget
|
|
ProcessSubTargetDatas(m_ActiveSubTarget.value);
|
|
m_ActiveSubTarget.value.target = this;
|
|
m_ActiveSubTarget.value.Setup(ref context);
|
|
}
|
|
|
|
public override void GetFields(ref TargetFieldContext context)
|
|
{
|
|
var descs = context.blocks.Select(x => x.descriptor);
|
|
// Stages
|
|
if (!context.pass.IsRaytracing()) // Don't handle vertex shader when using raytracing
|
|
{
|
|
context.AddField(Fields.GraphVertex, descs.Contains(BlockFields.VertexDescription.Position) ||
|
|
descs.Contains(BlockFields.VertexDescription.Normal) ||
|
|
descs.Contains(BlockFields.VertexDescription.Tangent));
|
|
}
|
|
|
|
context.AddField(Fields.GraphPixel);
|
|
|
|
// SubTarget
|
|
m_ActiveSubTarget.value.GetFields(ref context);
|
|
}
|
|
|
|
public override void GetActiveBlocks(ref TargetActiveBlockContext context)
|
|
{
|
|
// SubTarget
|
|
m_ActiveSubTarget.value.GetActiveBlocks(ref context);
|
|
}
|
|
|
|
public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action<String> registerUndo)
|
|
{
|
|
if (m_ActiveSubTarget.value == null)
|
|
return;
|
|
|
|
// Core properties
|
|
var graphValidation = context.graphValidation;
|
|
m_SubTargetField = new PopupField<string>(m_SubTargetNames, activeSubTargetIndex);
|
|
context.AddProperty("Material", m_SubTargetField, (evt) =>
|
|
{
|
|
if (Equals(activeSubTargetIndex, m_SubTargetField.index))
|
|
return;
|
|
|
|
var systemData = m_Datas.SelectValue().FirstOrDefault(x => x is SystemData) as SystemData;
|
|
if (systemData != null)
|
|
{
|
|
// Force material update hash
|
|
systemData.materialNeedsUpdateHash = -1;
|
|
}
|
|
|
|
m_ActiveSubTarget = m_SubTargets[m_SubTargetField.index];
|
|
ProcessSubTargetDatas(m_ActiveSubTarget.value);
|
|
onChange();
|
|
graphValidation();
|
|
});
|
|
|
|
// SubTarget properties
|
|
m_ActiveSubTarget.value.GetPropertiesGUI(ref context, onChange, registerUndo);
|
|
|
|
// Custom Editor GUI
|
|
m_CustomGUIField = new TextField("") { value = m_CustomEditorGUI };
|
|
m_CustomGUIField.RegisterCallback<FocusOutEvent>(s =>
|
|
{
|
|
if (Equals(m_CustomEditorGUI, m_CustomGUIField.value))
|
|
return;
|
|
|
|
m_CustomEditorGUI = m_CustomGUIField.value;
|
|
onChange();
|
|
});
|
|
context.AddProperty("Custom Editor GUI", m_CustomGUIField, (evt) => { });
|
|
|
|
// VFX Support
|
|
if (!m_IncompatibleVFXSubTargets.Contains(m_ActiveSubTarget.value.GetType()))
|
|
{
|
|
m_SupportVFXToggle = new Toggle("") { value = m_SupportVFX };
|
|
const string k_VFXToggleTooltip = "When enabled, this shader can be assigned to a compatible Visual Effect Graph output.";
|
|
context.AddProperty("Support VFX Graph", k_VFXToggleTooltip, 0, m_SupportVFXToggle, (evt) =>
|
|
{
|
|
registerUndo("Change Support VFX Graph");
|
|
m_SupportVFX = m_SupportVFXToggle.value;
|
|
onChange();
|
|
});
|
|
}
|
|
|
|
if (!m_IncompatibleHQLineRenderingSubTargets.Contains(m_ActiveSubTarget.value.GetType()))
|
|
{
|
|
m_SupportLineRenderingToggle = new Toggle("") { value = m_SupportLineRendering };
|
|
context.AddProperty("Support High Quality Line Rendering", "", 0, m_SupportLineRenderingToggle, (evt) =>
|
|
{
|
|
registerUndo("Change Support High Quality Line Rendering");
|
|
m_SupportLineRendering = m_SupportLineRenderingToggle.value;
|
|
onChange();
|
|
});
|
|
}
|
|
}
|
|
|
|
public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode)
|
|
{
|
|
// SubTarget
|
|
m_ActiveSubTarget.value.CollectShaderProperties(collector, generationMode);
|
|
|
|
collector.AddShaderProperty(LightmappingShaderProperties.kLightmapsArray);
|
|
collector.AddShaderProperty(LightmappingShaderProperties.kLightmapsIndirectionArray);
|
|
collector.AddShaderProperty(LightmappingShaderProperties.kShadowMasksArray);
|
|
}
|
|
|
|
public override void ProcessPreviewMaterial(Material material)
|
|
{
|
|
// SubTarget
|
|
m_ActiveSubTarget.value.ProcessPreviewMaterial(material);
|
|
}
|
|
|
|
public override object saveContext => m_ActiveSubTarget.value?.saveContext;
|
|
|
|
// IHasMetaData
|
|
public string identifier
|
|
{
|
|
get
|
|
{
|
|
if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData)
|
|
return subTargetHasMetaData.identifier;
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public ScriptableObject GetMetadataObject(GraphDataReadOnly graph)
|
|
{
|
|
if (m_ActiveSubTarget.value is IHasMetadata subTargetHasMetaData)
|
|
return subTargetHasMetaData.GetMetadataObject(graph);
|
|
|
|
return null;
|
|
}
|
|
|
|
public bool TrySetActiveSubTarget(Type subTargetType)
|
|
{
|
|
if (!subTargetType.IsSubclassOf(typeof(SubTarget)))
|
|
return false;
|
|
|
|
foreach (var subTarget in m_SubTargets)
|
|
{
|
|
if (subTarget.GetType().Equals(subTargetType))
|
|
{
|
|
m_ActiveSubTarget = subTarget;
|
|
ProcessSubTargetDatas(m_ActiveSubTarget);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void ProcessSubTargetDatas(SubTarget subTarget)
|
|
{
|
|
var typeCollection = TypeCache.GetTypesDerivedFrom<JsonObject>();
|
|
foreach (var type in typeCollection)
|
|
{
|
|
if (type.IsGenericType)
|
|
continue;
|
|
|
|
// Data requirement interfaces need generic type arguments
|
|
// Therefore we need to use reflections to call the method
|
|
var methodInfo = typeof(HDTarget).GetMethod(nameof(SetDataOnSubTarget));
|
|
var genericMethodInfo = methodInfo.MakeGenericMethod(type);
|
|
genericMethodInfo.Invoke(this, new object[] { subTarget });
|
|
}
|
|
}
|
|
|
|
void ClearUnusedData()
|
|
{
|
|
for (int i = 0; i < m_Datas.Count; i++)
|
|
{
|
|
var data = m_Datas[i];
|
|
var type = data.value.GetType();
|
|
|
|
// Data requirement interfaces need generic type arguments
|
|
// Therefore we need to use reflections to call the method
|
|
var methodInfo = typeof(HDTarget).GetMethod(nameof(ValidateDataForSubTarget));
|
|
var genericMethodInfo = methodInfo.MakeGenericMethod(type);
|
|
genericMethodInfo.Invoke(this, new object[] { m_ActiveSubTarget.value, data.value });
|
|
}
|
|
}
|
|
|
|
public void SetDataOnSubTarget<T>(SubTarget subTarget) where T : JsonObject
|
|
{
|
|
if (!(subTarget is IRequiresData<T> requiresData))
|
|
return;
|
|
|
|
// Ensure data object exists in list
|
|
var data = m_Datas.SelectValue().FirstOrDefault(x => x.GetType().Equals(typeof(T))) as T;
|
|
if (data == null)
|
|
{
|
|
data = Activator.CreateInstance(typeof(T)) as T;
|
|
m_Datas.Add(data);
|
|
}
|
|
|
|
// Apply data object to SubTarget
|
|
requiresData.data = data;
|
|
}
|
|
|
|
public void ValidateDataForSubTarget<T>(SubTarget subTarget, T data) where T : JsonObject
|
|
{
|
|
if (!(subTarget is IRequiresData<T> requiresData))
|
|
{
|
|
m_Datas.Remove(data);
|
|
}
|
|
}
|
|
|
|
public override void OnBeforeSerialize()
|
|
{
|
|
ClearUnusedData();
|
|
}
|
|
|
|
public bool TryUpgradeFromMasterNode(IMasterNode1 masterNode, out Dictionary<BlockFieldDescriptor, int> blockMap)
|
|
{
|
|
blockMap = null;
|
|
|
|
// We need to guarantee any required data object exists
|
|
// as we fill out the datas in the same method as determining which SubTarget is valid
|
|
// When the graph is serialized any unused data is removed anyway
|
|
var typeCollection = TypeCache.GetTypesDerivedFrom<HDTargetData>();
|
|
foreach (var type in typeCollection)
|
|
{
|
|
var data = Activator.CreateInstance(type) as HDTargetData;
|
|
m_Datas.Add(data);
|
|
}
|
|
|
|
// Process SubTargets
|
|
foreach (var subTarget in m_SubTargets)
|
|
{
|
|
if (!(subTarget is ILegacyTarget legacySubTarget))
|
|
continue;
|
|
|
|
// Ensure all SubTargets have any required data to fill out during upgrade
|
|
ProcessSubTargetDatas(subTarget);
|
|
subTarget.target = this;
|
|
|
|
if (legacySubTarget.TryUpgradeFromMasterNode(masterNode, out blockMap))
|
|
{
|
|
m_ActiveSubTarget = subTarget;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public override bool WorksWithSRP(RenderPipelineAsset scriptableRenderPipeline)
|
|
{
|
|
return scriptableRenderPipeline?.GetType() == typeof(HDRenderPipelineAsset);
|
|
}
|
|
|
|
public bool CanSupportVFX()
|
|
{
|
|
if (m_ActiveSubTarget.value == null)
|
|
return false;
|
|
|
|
if (m_IncompatibleVFXSubTargets.Contains(m_ActiveSubTarget.value.GetType()))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
public bool SupportsVFX()
|
|
{
|
|
if (CanSupportVFX())
|
|
return m_SupportVFX;
|
|
return false;
|
|
}
|
|
|
|
public void ConfigureContextData(VFXContext context, VFXTaskCompiledData data)
|
|
{
|
|
if (!(m_ActiveSubTarget.value is IRequireVFXContext vfxSubtarget))
|
|
return;
|
|
|
|
vfxSubtarget.ConfigureContextData(context, data);
|
|
}
|
|
|
|
public override bool DerivativeModificationCallback(
|
|
out string dstGraphFunctions,
|
|
out string dstGraphPixel,
|
|
out bool[] adjustedUvDerivs,
|
|
string primaryShaderName,
|
|
string passName,
|
|
string propStr,
|
|
string surfaceDescStr,
|
|
string graphFuncStr,
|
|
string graphPixelStr,
|
|
List<string> customFuncs,
|
|
bool applyEmulatedDerivatives)
|
|
{
|
|
//List<string> ignoredFuncs = new List<string>();
|
|
//ignoredFuncs.Add("Unity_Checkerboard_float");
|
|
//ignoredFuncs.Add("Unity_Checkerboard_half");
|
|
|
|
bool success = false;
|
|
|
|
dstGraphFunctions = "";
|
|
dstGraphPixel = "";
|
|
|
|
var uvCount = ShaderGeneratorNames.UVCount;
|
|
adjustedUvDerivs = new bool[uvCount];
|
|
|
|
HlslProcessor hlslProc = new HlslProcessor(uvCount);
|
|
|
|
try
|
|
{
|
|
hlslProc.ProcessFunctions(propStr, surfaceDescStr, graphFuncStr, graphPixelStr, applyEmulatedDerivatives, customFuncs, primaryShaderName);
|
|
|
|
if (hlslProc.isValid)
|
|
{
|
|
dstGraphFunctions = hlslProc.dstGraphFunctions;
|
|
dstGraphPixel = hlslProc.dstGraphPixel;
|
|
|
|
System.Array.Copy(hlslProc.adjustedUvDerivs, adjustedUvDerivs, adjustedUvDerivs.Length);
|
|
|
|
success = true;
|
|
}
|
|
else
|
|
{
|
|
string warnText = "derivative parsing failed: " + primaryShaderName;
|
|
Debug.LogWarning(warnText);
|
|
hlslProc.debugLog += warnText + "\n";
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
string warnText = e.Message + " (derivative exception caught: " + primaryShaderName + ")";
|
|
Debug.LogWarning(warnText);
|
|
hlslProc.debugLog += warnText + "\n";
|
|
hlslProc.debugLog += e.StackTrace;
|
|
|
|
// also, add the generated node stack if we have one
|
|
hlslProc.debugLog += "\n";
|
|
hlslProc.debugLog += "NodeStack: " + hlslProc.debugNodeStack.Count.ToString() + "\n";
|
|
for (int i = 0; i < hlslProc.debugNodeStack.Count; i++)
|
|
{
|
|
int nodeId = hlslProc.debugNodeStack[i];
|
|
hlslProc.debugLog += " " + nodeId.ToString() + "\n";
|
|
}
|
|
|
|
success = false;
|
|
}
|
|
var isDebugOutputNeed =
|
|
GraphicsSettings.TryGetRenderPipelineSettings<AnalyticDerivativeSettings>(
|
|
out var analyticDerivativeSettings) && analyticDerivativeSettings.debugOutput;
|
|
|
|
if (isDebugOutputNeed)
|
|
{
|
|
string cleanName = primaryShaderName.Replace("/", "_").Replace("\\", "_"); ;
|
|
string dstDebugBasePath = "Temp/ShaderDerivative_" + cleanName + "__" + passName + "__";
|
|
|
|
string origName = dstDebugBasePath + "00_original.txt";
|
|
string tokenizedName = dstDebugBasePath + "01_tokenized.txt";
|
|
string parsedName = dstDebugBasePath + "02_parsed.txt";
|
|
string reconstructName = dstDebugBasePath + "03_reconstruct.txt";
|
|
string nodeName = dstDebugBasePath + "04_node.txt";
|
|
string genName = dstDebugBasePath + "05_generated.txt";
|
|
string logName = dstDebugBasePath + "06_log.txt";
|
|
|
|
System.IO.File.WriteAllText(origName, hlslProc.debugTextInput);
|
|
System.IO.File.WriteAllText(tokenizedName, hlslProc.debugTokenizerInfo);
|
|
System.IO.File.WriteAllText(parsedName, hlslProc.debugParserTree);
|
|
System.IO.File.WriteAllText(reconstructName, hlslProc.debugDirectReconstruction);
|
|
System.IO.File.WriteAllText(nodeName, hlslProc.debugNodeInfo);
|
|
System.IO.File.WriteAllText(genName, hlslProc.debugTextOutput);
|
|
System.IO.File.WriteAllText(logName, hlslProc.debugLog);
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#region BlockMasks
|
|
static class CoreBlockMasks
|
|
{
|
|
public static BlockFieldDescriptor[] Vertex = new BlockFieldDescriptor[]
|
|
{
|
|
BlockFields.VertexDescription.Position,
|
|
BlockFields.VertexDescription.Normal,
|
|
BlockFields.VertexDescription.Tangent,
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region StructCollections
|
|
static class CoreStructCollections
|
|
{
|
|
public static StructCollection BasicProcedural = new StructCollection
|
|
{
|
|
{ HDStructs.AttributesMeshProcedural },
|
|
{ HDStructs.VaryingsMeshToPS },
|
|
{ HDStructs.VertexDescriptionInputsProcedural },
|
|
{ Structs.SurfaceDescriptionInputs },
|
|
};
|
|
|
|
public static StructCollection Basic = new StructCollection
|
|
{
|
|
{ HDStructs.AttributesMesh },
|
|
{ HDStructs.VaryingsMeshToPS },
|
|
{ Structs.VertexDescriptionInputs },
|
|
{ Structs.SurfaceDescriptionInputs },
|
|
};
|
|
|
|
// VFX have its own structure define in PostProcessSubShader that replace existing one
|
|
|
|
// Will be append on top of Default if tessellation is enabled
|
|
public static StructCollection BasicTessellation = new StructCollection
|
|
{
|
|
{ HDStructs.AttributesMesh },
|
|
{ HDStructs.VaryingsMeshToDS },
|
|
{ HDStructs.VaryingsMeshToPS },
|
|
{ Structs.VertexDescriptionInputs },
|
|
{ Structs.SurfaceDescriptionInputs },
|
|
};
|
|
|
|
public static StructCollection BasicProceduralTessellation = new StructCollection
|
|
{
|
|
{ HDStructs.AttributesMeshProcedural },
|
|
{ HDStructs.VaryingsMeshToDS },
|
|
{ HDStructs.VaryingsMeshToPS },
|
|
{ HDStructs.VertexDescriptionInputsProcedural },
|
|
{ Structs.SurfaceDescriptionInputs },
|
|
};
|
|
|
|
public static StructCollection BasicRaytracing = new StructCollection
|
|
{
|
|
{ Structs.SurfaceDescriptionInputs },
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region FieldDependencies
|
|
static class CoreFieldDependencies
|
|
{
|
|
public static DependencyCollection Varying = new DependencyCollection
|
|
{
|
|
//Standard Varying Dependencies
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.positionRWS, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.positionPredisplacementRWS, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.normalWS, HDStructFields.AttributesMesh.normalOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.tangentWS, HDStructFields.AttributesMesh.tangentOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord0, HDStructFields.AttributesMesh.uv0),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord1, HDStructFields.AttributesMesh.uv1),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord2, HDStructFields.AttributesMesh.uv2),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord3, HDStructFields.AttributesMesh.uv3),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord4, HDStructFields.AttributesMesh.uv4),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord5, HDStructFields.AttributesMesh.uv5),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord6, HDStructFields.AttributesMesh.uv6),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord7, HDStructFields.AttributesMesh.uv7),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.color, HDStructFields.AttributesMesh.color),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.instanceID, HDStructFields.AttributesMesh.instanceID),
|
|
};
|
|
|
|
public static DependencyCollection Tessellation = new DependencyCollection
|
|
{
|
|
//Tessellation Varying Dependencies
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.positionRWS, HDStructFields.VaryingsMeshToDS.positionRWS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.positionPredisplacementRWS, HDStructFields.VaryingsMeshToDS.positionPredisplacementRWS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.normalWS, HDStructFields.VaryingsMeshToDS.normalWS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.tangentWS, HDStructFields.VaryingsMeshToDS.tangentWS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord0, HDStructFields.VaryingsMeshToDS.texCoord0),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord1, HDStructFields.VaryingsMeshToDS.texCoord1),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord2, HDStructFields.VaryingsMeshToDS.texCoord2),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord3, HDStructFields.VaryingsMeshToDS.texCoord3),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord4, HDStructFields.VaryingsMeshToDS.texCoord4),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord5, HDStructFields.VaryingsMeshToDS.texCoord5),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord6, HDStructFields.VaryingsMeshToDS.texCoord6),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.texCoord7, HDStructFields.VaryingsMeshToDS.texCoord7),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.color, HDStructFields.VaryingsMeshToDS.color),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToPS.instanceID, HDStructFields.VaryingsMeshToDS.instanceID),
|
|
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.positionRWS, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.positionPredisplacementRWS, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.normalWS, HDStructFields.AttributesMesh.normalOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.tangentWS, HDStructFields.AttributesMesh.tangentOS),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord0, HDStructFields.AttributesMesh.uv0),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord1, HDStructFields.AttributesMesh.uv1),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord2, HDStructFields.AttributesMesh.uv2),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord3, HDStructFields.AttributesMesh.uv3),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord4, HDStructFields.AttributesMesh.uv4),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord5, HDStructFields.AttributesMesh.uv5),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord6, HDStructFields.AttributesMesh.uv6),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.texCoord7, HDStructFields.AttributesMesh.uv7),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.color, HDStructFields.AttributesMesh.color),
|
|
new FieldDependency(HDStructFields.VaryingsMeshToDS.instanceID, HDStructFields.AttributesMesh.instanceID),
|
|
};
|
|
|
|
public static DependencyCollection FragInput = new DependencyCollection
|
|
{
|
|
//FragInput dependencies
|
|
new FieldDependency(HDStructFields.FragInputs.positionRWS, HDStructFields.VaryingsMeshToPS.positionRWS),
|
|
new FieldDependency(HDStructFields.FragInputs.positionPredisplacementRWS, HDStructFields.VaryingsMeshToPS.positionPredisplacementRWS),
|
|
new FieldDependency(HDStructFields.FragInputs.tangentToWorld, HDStructFields.VaryingsMeshToPS.tangentWS),
|
|
new FieldDependency(HDStructFields.FragInputs.tangentToWorld, HDStructFields.VaryingsMeshToPS.normalWS),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord0, HDStructFields.VaryingsMeshToPS.texCoord0),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord1, HDStructFields.VaryingsMeshToPS.texCoord1),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord2, HDStructFields.VaryingsMeshToPS.texCoord2),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord3, HDStructFields.VaryingsMeshToPS.texCoord3),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord4, HDStructFields.VaryingsMeshToPS.texCoord4),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord5, HDStructFields.VaryingsMeshToPS.texCoord5),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord6, HDStructFields.VaryingsMeshToPS.texCoord6),
|
|
new FieldDependency(HDStructFields.FragInputs.texCoord7, HDStructFields.VaryingsMeshToPS.texCoord7),
|
|
new FieldDependency(HDStructFields.FragInputs.color, HDStructFields.VaryingsMeshToPS.color),
|
|
new FieldDependency(HDStructFields.FragInputs.instanceID, HDStructFields.VaryingsMeshToPS.instanceID),
|
|
};
|
|
|
|
public static DependencyCollection VertexDescription = new DependencyCollection
|
|
{
|
|
//Vertex Description Dependencies
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceNormal, HDStructFields.AttributesMesh.normalOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceNormal, HDStructFields.AttributesMesh.normalOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceNormal, StructFields.VertexDescriptionInputs.WorldSpaceNormal),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceTangent, HDStructFields.AttributesMesh.tangentOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceTangent, HDStructFields.AttributesMesh.tangentOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceTangent, StructFields.VertexDescriptionInputs.WorldSpaceTangent),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceBiTangent, HDStructFields.AttributesMesh.normalOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceBiTangent, HDStructFields.AttributesMesh.tangentOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceBiTangent, StructFields.VertexDescriptionInputs.ObjectSpaceBiTangent),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceBiTangent, StructFields.VertexDescriptionInputs.WorldSpaceBiTangent),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpacePosition, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpacePosition, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.AbsoluteWorldSpacePosition, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpacePosition, StructFields.VertexDescriptionInputs.WorldSpacePosition),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpacePositionPredisplacement, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpacePositionPredisplacement, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.AbsoluteWorldSpacePositionPredisplacement, HDStructFields.AttributesMesh.positionOS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpacePositionPredisplacement, StructFields.VertexDescriptionInputs.WorldSpacePosition),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceViewDirection, StructFields.VertexDescriptionInputs.WorldSpacePosition),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceViewDirection, StructFields.VertexDescriptionInputs.WorldSpaceViewDirection),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ViewSpaceViewDirection, StructFields.VertexDescriptionInputs.WorldSpaceViewDirection),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection, StructFields.VertexDescriptionInputs.WorldSpaceViewDirection),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection, StructFields.VertexDescriptionInputs.WorldSpaceTangent),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection, StructFields.VertexDescriptionInputs.WorldSpaceBiTangent),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.TangentSpaceViewDirection, StructFields.VertexDescriptionInputs.WorldSpaceNormal),
|
|
|
|
// vertex shader: screen position reads from world space position, then used to calculate NDC and Pixel position
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ScreenPosition, StructFields.VertexDescriptionInputs.WorldSpacePosition),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.NDCPosition, StructFields.VertexDescriptionInputs.ScreenPosition),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.PixelPosition, StructFields.VertexDescriptionInputs.NDCPosition),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv0, HDStructFields.AttributesMesh.uv0),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv1, HDStructFields.AttributesMesh.uv1),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv2, HDStructFields.AttributesMesh.uv2),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv3, HDStructFields.AttributesMesh.uv3),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv4, HDStructFields.AttributesMesh.uv4),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv5, HDStructFields.AttributesMesh.uv5),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv6, HDStructFields.AttributesMesh.uv6),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv7, HDStructFields.AttributesMesh.uv7),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.VertexColor, HDStructFields.AttributesMesh.color),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.BoneWeights, HDStructFields.AttributesMesh.weights),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.BoneIndices, HDStructFields.AttributesMesh.indices),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.VertexID, HDStructFields.AttributesMesh.vertexID),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.InstanceID, HDStructFields.AttributesMesh.instanceID),
|
|
};
|
|
|
|
public static DependencyCollection VertexDescriptionTessellation = new DependencyCollection
|
|
{
|
|
//Vertex Description Dependencies
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceTangent, HDStructFields.VaryingsMeshToDS.tangentWS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.WorldSpaceTangent, HDStructFields.VaryingsMeshToDS.tangentWS),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.ObjectSpaceBiTangent, HDStructFields.VaryingsMeshToDS.tangentWS),
|
|
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv0, HDStructFields.VaryingsMeshToDS.texCoord0),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv1, HDStructFields.VaryingsMeshToDS.texCoord1),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv2, HDStructFields.VaryingsMeshToDS.texCoord2),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv3, HDStructFields.VaryingsMeshToDS.texCoord3),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv4, HDStructFields.VaryingsMeshToDS.texCoord4),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv5, HDStructFields.VaryingsMeshToDS.texCoord5),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv6, HDStructFields.VaryingsMeshToDS.texCoord6),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.uv7, HDStructFields.VaryingsMeshToDS.texCoord7),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.VertexColor, HDStructFields.VaryingsMeshToDS.color),
|
|
new FieldDependency(StructFields.VertexDescriptionInputs.InstanceID, HDStructFields.VaryingsMeshToDS.instanceID),
|
|
};
|
|
|
|
public static DependencyCollection SurfaceDescription = new DependencyCollection
|
|
{
|
|
//Surface Description Dependencies
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceNormal, HDStructFields.FragInputs.tangentToWorld),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceNormal, StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceNormal, StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),
|
|
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceTangent, HDStructFields.FragInputs.tangentToWorld),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceTangent, StructFields.SurfaceDescriptionInputs.WorldSpaceTangent),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceTangent, StructFields.SurfaceDescriptionInputs.WorldSpaceTangent),
|
|
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent, HDStructFields.FragInputs.tangentToWorld),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceBiTangent, StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceBiTangent, StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent),
|
|
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpacePosition, HDStructFields.FragInputs.positionRWS),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.AbsoluteWorldSpacePosition, HDStructFields.FragInputs.positionRWS),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpacePosition, HDStructFields.FragInputs.positionRWS),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpacePosition, HDStructFields.FragInputs.positionRWS),
|
|
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpacePositionPredisplacement, HDStructFields.FragInputs.positionPredisplacementRWS),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.AbsoluteWorldSpacePositionPredisplacement, HDStructFields.FragInputs.positionPredisplacementRWS),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpacePositionPredisplacement, HDStructFields.FragInputs.positionPredisplacementRWS),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpacePositionPredisplacement, HDStructFields.FragInputs.positionPredisplacementRWS),
|
|
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection, HDStructFields.FragInputs.positionRWS),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ObjectSpaceViewDirection, StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ViewSpaceViewDirection, StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection, StructFields.SurfaceDescriptionInputs.WorldSpaceViewDirection),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection, StructFields.SurfaceDescriptionInputs.WorldSpaceTangent),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection, StructFields.SurfaceDescriptionInputs.WorldSpaceBiTangent),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.TangentSpaceViewDirection, StructFields.SurfaceDescriptionInputs.WorldSpaceNormal),
|
|
|
|
// pixel shader: pixel position read from vpos, then used to calculate NDC position. Screen position calculated separately from world space position
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.PixelPosition, HDStructFields.FragInputs.positionPixel),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.NDCPosition, StructFields.SurfaceDescriptionInputs.PixelPosition),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.ScreenPosition, StructFields.SurfaceDescriptionInputs.WorldSpacePosition),
|
|
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv0, HDStructFields.FragInputs.texCoord0),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv1, HDStructFields.FragInputs.texCoord1),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv2, HDStructFields.FragInputs.texCoord2),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv3, HDStructFields.FragInputs.texCoord3),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv4, HDStructFields.FragInputs.texCoord4),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv5, HDStructFields.FragInputs.texCoord5),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv6, HDStructFields.FragInputs.texCoord6),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.uv7, HDStructFields.FragInputs.texCoord7),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.VertexColor, HDStructFields.FragInputs.color),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.InstanceID, HDStructFields.FragInputs.instanceID),
|
|
new FieldDependency(StructFields.SurfaceDescriptionInputs.FaceSign, HDStructFields.FragInputs.IsFrontFace),
|
|
};
|
|
|
|
public static DependencyCollection Default = new DependencyCollection
|
|
{
|
|
{ Varying },
|
|
{ Tessellation },
|
|
{ FragInput },
|
|
{ VertexDescription },
|
|
{ VertexDescriptionTessellation },
|
|
{ SurfaceDescription },
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region RequiredFields
|
|
static class CoreRequiredFields
|
|
{
|
|
public static FieldCollection Meta = new FieldCollection()
|
|
{
|
|
HDStructFields.AttributesMesh.positionOS,
|
|
HDStructFields.AttributesMesh.normalOS,
|
|
HDStructFields.AttributesMesh.uv0,
|
|
HDStructFields.AttributesMesh.uv1,
|
|
HDStructFields.AttributesMesh.uv2,
|
|
HDStructFields.AttributesMesh.uv3,
|
|
HDStructFields.AttributesMesh.uv4,
|
|
HDStructFields.AttributesMesh.uv5,
|
|
HDStructFields.AttributesMesh.uv6,
|
|
HDStructFields.AttributesMesh.uv7,
|
|
HDStructFields.FragInputs.positionRWS,
|
|
HDStructFields.FragInputs.positionPredisplacementRWS,
|
|
HDStructFields.FragInputs.texCoord0,
|
|
HDStructFields.FragInputs.texCoord1,
|
|
HDStructFields.FragInputs.texCoord2,
|
|
HDStructFields.FragInputs.texCoord3,
|
|
HDStructFields.FragInputs.texCoord4,
|
|
HDStructFields.FragInputs.texCoord5,
|
|
HDStructFields.FragInputs.texCoord6,
|
|
HDStructFields.FragInputs.texCoord7,
|
|
};
|
|
|
|
public static FieldCollection Basic = new FieldCollection()
|
|
{
|
|
};
|
|
|
|
// positionRWS required by GetSurfaceAndBuiltinData.
|
|
public static FieldCollection BasicSurfaceData = new FieldCollection()
|
|
{
|
|
Basic,
|
|
HDStructFields.FragInputs.positionRWS,
|
|
};
|
|
|
|
public static FieldCollection BasicLighting = new FieldCollection()
|
|
{
|
|
// We need positionRWS to calculate the view vector per pixel for some hardcoded effect like Specular occlusion
|
|
// We also need it to calculate motion vector
|
|
HDStructFields.FragInputs.positionRWS,
|
|
// We need to have tangent because if a lighting model have anisotropy and require tangent, it need to be present
|
|
// This works for all lighting shader type including raytracing other fields are included due to DependencyCollection
|
|
HDStructFields.FragInputs.tangentToWorld,
|
|
// UV1 / 2 are always included for lightmaps (static and dynamic) sampling
|
|
HDStructFields.FragInputs.texCoord1,
|
|
HDStructFields.FragInputs.texCoord2,
|
|
};
|
|
|
|
// Note: this can result in duplicate with BasicLighting but shouldn't be an issue
|
|
public static FieldCollection AddWriteNormalBuffer = new FieldCollection()
|
|
{
|
|
HDStructFields.FragInputs.tangentToWorld, // Required for WRITE_NORMAL_BUFFER case (to access to vertex normal)
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region RenderStates
|
|
static class CoreRenderStates
|
|
{
|
|
public static class Uniforms
|
|
{
|
|
public static readonly string srcBlend = "[_SrcBlend]";
|
|
public static readonly string dstBlend = "[_DstBlend]";
|
|
public static readonly string alphaSrcBlend = "[_AlphaSrcBlend]";
|
|
public static readonly string alphaDstBlend = "[_AlphaDstBlend]";
|
|
public static readonly string alphaCutoffEnable = "[_AlphaCutoffEnable]";
|
|
public static readonly string cullMode = "[_CullMode]";
|
|
public static readonly string cullModeForward = "[_CullModeForward]";
|
|
public static readonly string zTestDepthEqualForOpaque = "[_ZTestDepthEqualForOpaque]";
|
|
public static readonly string zTestTransparent = "[_ZTestTransparent]";
|
|
public static readonly string zTestGBuffer = "[_ZTestGBuffer]";
|
|
public static readonly string zWrite = "[_ZWrite]";
|
|
public static readonly string zClip = "[_ZClip]";
|
|
public static readonly string stencilWriteMaskDepth = "[_StencilWriteMaskDepth]";
|
|
public static readonly string stencilRefDepth = "[_StencilRefDepth]";
|
|
public static readonly string stencilWriteMaskMV = "[_StencilWriteMaskMV]";
|
|
public static readonly string stencilRefMV = "[_StencilRefMV]";
|
|
public static readonly string stencilWriteMask = "[_StencilWriteMask]";
|
|
public static readonly string stencilRef = "[_StencilRef]";
|
|
public static readonly string stencilWriteMaskGBuffer = "[_StencilWriteMaskGBuffer]";
|
|
public static readonly string stencilRefGBuffer = "[_StencilRefGBuffer]";
|
|
public static readonly string stencilRefDistortionVec = "[_StencilRefDistortionVec]";
|
|
public static readonly string stencilWriteMaskDistortionVec = "[_StencilWriteMaskDistortionVec]";
|
|
}
|
|
|
|
public static string PremultipliedTransparency(int target) => $"Blend {target} One OneMinusSrcAlpha";
|
|
|
|
public static RenderStateCollection Meta = new RenderStateCollection
|
|
{
|
|
{ RenderState.Cull(Cull.Off) },
|
|
};
|
|
|
|
public static RenderStateCollection ShadowCaster = new RenderStateCollection
|
|
{
|
|
{ RenderState.Cull(Uniforms.cullMode) },
|
|
{ RenderState.ZWrite(ZWrite.On) },
|
|
{ RenderState.ZClip(Uniforms.zClip) },
|
|
{ RenderState.ColorMask("ColorMask 0") },
|
|
};
|
|
|
|
public static RenderStateCollection BlendShadowCaster = new RenderStateCollection
|
|
{
|
|
{ RenderState.Blend(Blend.One, Blend.Zero) },
|
|
{ RenderState.Cull(Uniforms.cullMode) },
|
|
{ RenderState.ZWrite(ZWrite.On) },
|
|
{ RenderState.ZClip(Uniforms.zClip) },
|
|
{ RenderState.ColorMask("ColorMask 0") },
|
|
};
|
|
|
|
public static RenderStateCollection ScenePicking = new RenderStateCollection
|
|
{
|
|
{ RenderState.Cull(Uniforms.cullMode) },
|
|
};
|
|
|
|
public static RenderStateCollection SceneSelection = new RenderStateCollection
|
|
{
|
|
{ RenderState.Cull(Cull.Off) },
|
|
};
|
|
|
|
public static RenderStateCollection DepthOnly = new RenderStateCollection
|
|
{
|
|
{ RenderState.Cull(Uniforms.cullMode) },
|
|
{ RenderState.ZWrite(ZWrite.On) },
|
|
{ RenderState.AlphaToMask(Uniforms.alphaCutoffEnable), new FieldCondition(Fields.AlphaToMask, true) },
|
|
{ RenderState.Stencil(new StencilDescriptor()
|
|
{
|
|
WriteMask = Uniforms.stencilWriteMaskDepth,
|
|
Ref = Uniforms.stencilRefDepth,
|
|
Comp = "Always",
|
|
Pass = "Replace",
|
|
}) },
|
|
};
|
|
|
|
public static RenderStateCollection MotionVectors = new RenderStateCollection
|
|
{
|
|
{ RenderState.Cull(Uniforms.cullMode) },
|
|
{ RenderState.ZWrite(ZWrite.On) },
|
|
{ RenderState.AlphaToMask(Uniforms.alphaCutoffEnable), new FieldCondition(Fields.AlphaToMask, true) },
|
|
{ RenderState.Stencil(new StencilDescriptor()
|
|
{
|
|
WriteMask = Uniforms.stencilWriteMaskMV,
|
|
Ref = Uniforms.stencilRefMV,
|
|
Comp = "Always",
|
|
Pass = "Replace",
|
|
}) },
|
|
};
|
|
|
|
public static RenderStateCollection TransparentBackface = new RenderStateCollection
|
|
{
|
|
{ RenderState.Blend(Uniforms.srcBlend, Uniforms.dstBlend, Uniforms.alphaSrcBlend, Uniforms.alphaDstBlend) },
|
|
{ RenderState.Blend(PremultipliedTransparency(1)) },
|
|
{ RenderState.Blend(PremultipliedTransparency(2)) },
|
|
{ RenderState.Blend(PremultipliedTransparency(3)) },
|
|
{ RenderState.Blend(PremultipliedTransparency(4)) },
|
|
{ RenderState.Cull(Cull.Front) },
|
|
{ RenderState.ZWrite(Uniforms.zWrite) },
|
|
{ RenderState.ZTest(Uniforms.zTestTransparent) },
|
|
{ RenderState.ColorMask("ColorMask [_ColorMaskTransparentVelOne] 1") },
|
|
{ RenderState.ColorMask("ColorMask [_ColorMaskTransparentVelTwo] 2") },
|
|
};
|
|
|
|
|
|
public static RenderStateCollection TransparentDepthPrePass = new RenderStateCollection
|
|
{
|
|
{ RenderState.Blend(Blend.One, Blend.Zero) },
|
|
{ RenderState.Cull(Uniforms.cullMode) },
|
|
{ RenderState.ZWrite(ZWrite.On) },
|
|
{ RenderState.Stencil(new StencilDescriptor()
|
|
{
|
|
WriteMask = CoreRenderStates.Uniforms.stencilWriteMaskDepth,
|
|
Ref = CoreRenderStates.Uniforms.stencilRefDepth,
|
|
Comp = "Always",
|
|
Pass = "Replace",
|
|
}) },
|
|
};
|
|
|
|
public static RenderStateCollection TransparentDepthPostPass = new RenderStateCollection
|
|
{
|
|
{ RenderState.Blend(Blend.One, Blend.Zero) },
|
|
{ RenderState.Cull(Uniforms.cullMode) },
|
|
{ RenderState.ZWrite(ZWrite.On) },
|
|
{ RenderState.ColorMask("ColorMask 0") },
|
|
};
|
|
|
|
public static RenderStateCollection Forward = new RenderStateCollection
|
|
{
|
|
{ RenderState.Blend(Uniforms.srcBlend, Uniforms.dstBlend, Uniforms.alphaSrcBlend, Uniforms.alphaDstBlend) },
|
|
{ RenderState.Blend(PremultipliedTransparency(1)) },
|
|
{ RenderState.Blend("Blend 2 One [_DstBlend2]") },
|
|
{ RenderState.Blend("Blend 3 One [_DstBlend2]") },
|
|
{ RenderState.Blend(PremultipliedTransparency(4)) },
|
|
{ RenderState.Cull(Uniforms.cullModeForward) },
|
|
{ RenderState.ZWrite(Uniforms.zWrite) },
|
|
{ RenderState.ZTest(Uniforms.zTestDepthEqualForOpaque) },
|
|
{ RenderState.ColorMask("ColorMask [_ColorMaskTransparentVelOne] 1") },
|
|
{ RenderState.ColorMask("ColorMask [_ColorMaskTransparentVelTwo] 2") },
|
|
{ RenderState.Stencil(new StencilDescriptor()
|
|
{
|
|
WriteMask = Uniforms.stencilWriteMask,
|
|
Ref = Uniforms.stencilRef,
|
|
Comp = "Always",
|
|
Pass = "Replace",
|
|
}) },
|
|
};
|
|
|
|
public static RenderStateCollection LineRendering = new RenderStateCollection
|
|
{
|
|
{ RenderState.Blend(Blend.One, Blend.Zero) },
|
|
{ RenderState.Cull("Off") },
|
|
{ RenderState.ZWrite(ZWrite.On) },
|
|
{ RenderState.ZTest("Always") },
|
|
{ RenderState.Stencil(new StencilDescriptor()
|
|
{
|
|
WriteMask = Uniforms.stencilWriteMask,
|
|
Ref = Uniforms.stencilRef,
|
|
Comp = "Always",
|
|
Pass = "Replace",
|
|
}) },
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region Pragmas
|
|
static class CorePragmas
|
|
{
|
|
// We will always select Basic, BasicVFX or BasicTessellation - added in PostProcessSubShader
|
|
public static PragmaCollection Basic = new PragmaCollection
|
|
{
|
|
{ Pragma.Target(ShaderModel.Target45) },
|
|
{ Pragma.Vertex("Vert") },
|
|
{ Pragma.Fragment("Frag") },
|
|
{ Pragma.OnlyRenderers(PragmaRenderers.GetHighEndPlatformArray()) },
|
|
};
|
|
|
|
public static PragmaCollection BasicVFX = new PragmaCollection
|
|
{
|
|
{ Pragma.Target(ShaderModel.Target45) },
|
|
{ Pragma.Vertex("VertVFX") },
|
|
{ Pragma.Fragment("Frag") },
|
|
{ Pragma.OnlyRenderers(PragmaRenderers.GetHighEndPlatformArray()) },
|
|
};
|
|
|
|
public static PragmaCollection BasicTessellation = new PragmaCollection
|
|
{
|
|
{ Pragma.Target(ShaderModel.Target50) },
|
|
{ Pragma.Vertex("Vert") },
|
|
{ Pragma.Fragment("Frag") },
|
|
{ Pragma.Hull("Hull") },
|
|
{ Pragma.Domain("Domain") },
|
|
{ Pragma.OnlyRenderers(PragmaRenderers.GetHighEndPlatformArray()) },
|
|
};
|
|
|
|
public static PragmaCollection BasicRaytracing = new PragmaCollection
|
|
{
|
|
{ Pragma.Target(ShaderModel.Target50) },
|
|
{ Pragma.Raytracing("surface_shader") },
|
|
{ Pragma.OnlyRenderers(new Platform[] {Platform.D3D11, Platform.GameCoreXboxSeries, Platform.PS5}) },
|
|
};
|
|
|
|
public static PragmaCollection BasicKernel = new PragmaCollection
|
|
{
|
|
{ Pragma.Kernel("Kernel") },
|
|
};
|
|
|
|
// Here are the Pragma Collection we can add on top of the Basic one
|
|
public static PragmaCollection DotsInstanced = new PragmaCollection
|
|
{
|
|
{ Pragma.DOTSInstancing },
|
|
{ Pragma.InstancingOptions(InstancingOptions.RenderingLayer) },
|
|
};
|
|
|
|
public static PragmaCollection DotsInstancedEditorSync = new PragmaCollection
|
|
{
|
|
{ Pragma.DOTSInstancing },
|
|
{ Pragma.EditorSyncCompilation },
|
|
{ Pragma.InstancingOptions(InstancingOptions.RenderingLayer) },
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region Keywords
|
|
static class CoreKeywords
|
|
{
|
|
public static KeywordCollection RaytracingGBuffer = new KeywordCollection
|
|
{
|
|
{ CoreKeywordDescriptors.RaytraceMinimalGBuffer },
|
|
};
|
|
|
|
public static KeywordCollection RaytracingVisiblity = new KeywordCollection
|
|
{
|
|
{ CoreKeywordDescriptors.TransparentColorShadow },
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region Defines
|
|
static class CoreDefines
|
|
{
|
|
public static DefineCollection SupportGlobalMipBias = new DefineCollection
|
|
{
|
|
{ CoreKeywordDescriptors.SupportGlobalMipBias, 1 },
|
|
};
|
|
|
|
public static DefineCollection Tessellation = new DefineCollection
|
|
{
|
|
{ CoreKeywordDescriptors.Tessellation, 1 },
|
|
{ CoreKeywordDescriptors.TessellationModification, 1 },
|
|
};
|
|
|
|
public static DefineCollection ScenePicking = new DefineCollection
|
|
{
|
|
{ CoreKeywordDescriptors.ScenePickingPass, 1 },
|
|
};
|
|
|
|
public static DefineCollection Meta = new DefineCollection
|
|
{
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
// Use Unity's built-in matrices for meta pass rendering
|
|
{ CoreKeywordDescriptors.ScenePickingPass, 1 },
|
|
};
|
|
|
|
public static DefineCollection SceneSelection = new DefineCollection
|
|
{
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
{ CoreKeywordDescriptors.SceneSelectionPass, 1 },
|
|
};
|
|
|
|
public static DefineCollection DepthForwardOnly = new DefineCollection
|
|
{
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
{ CoreKeywordDescriptors.WriteNormalBuffer, 1 },
|
|
};
|
|
|
|
public static DefineCollection DepthForwardOnlyUnlit = new DefineCollection
|
|
{
|
|
// When using Shadow matte, we need to output a normal buffer even for unlit so it is compatible with ambient occlusion
|
|
{ CoreKeywordDescriptors.WriteNormalBuffer, 1, new FieldCondition(HDUnlitSubTarget.EnableShadowMatte, true)},
|
|
};
|
|
|
|
public static DefineCollection MotionVectorUnlit = new DefineCollection
|
|
{
|
|
// When using Shadow matte, we need to output a normal buffer even for unlit so it is compatible with ambient occlusion
|
|
{ CoreKeywordDescriptors.WriteNormalBuffer, 1, new FieldCondition(HDUnlitSubTarget.EnableShadowMatte, true)},
|
|
};
|
|
|
|
public static DefineCollection ShaderGraphRaytracingDefault = new DefineCollection
|
|
{
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
};
|
|
|
|
public static DefineCollection TransparentDepthPrepass = new DefineCollection
|
|
{
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
};
|
|
|
|
public static DefineCollection TransparentDepthPostpass = new DefineCollection
|
|
{
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
};
|
|
|
|
public static DefineCollection Forward = new DefineCollection
|
|
{
|
|
{ CoreKeywordDescriptors.SupportBlendModePreserveSpecularLighting, 1 },
|
|
{ CoreKeywordDescriptors.HasLightloop, 1 },
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
};
|
|
|
|
public static DefineCollection ForwardLit = new DefineCollection
|
|
{
|
|
{ CoreKeywordDescriptors.SupportBlendModePreserveSpecularLighting, 1 },
|
|
{ CoreKeywordDescriptors.HasLightloop, 1 },
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
{ CoreKeywordDescriptors.ShaderLit, 1 },
|
|
};
|
|
|
|
public static DefineCollection ForwardUnlit = new DefineCollection
|
|
{
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
};
|
|
|
|
public static DefineCollection BackThenFront = new DefineCollection
|
|
{
|
|
{ CoreKeywordDescriptors.SupportBlendModePreserveSpecularLighting, 1 },
|
|
{ CoreKeywordDescriptors.HasLightloop, 1 },
|
|
{ RayTracingQualityNode.GetRayTracingQualityKeyword(), 0 },
|
|
// { CoreKeywordDescriptors.LightList, 1 }, // BackThenFront Transparent use #define USE_CLUSTERED_LIGHTLIST
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region Includes
|
|
static class CoreIncludes
|
|
{
|
|
// CorePregraph
|
|
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 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";
|
|
public const string kPickingSpaceTransforms = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/PickingSpaceTransforms.hlsl";
|
|
|
|
// CoreUtility
|
|
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
|
|
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 kLitPathtracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/LitPathTracing.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 kFabricPathtracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fabric/FabricPathTracing.hlsl";
|
|
public const string kEyeRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Eye/EyeRaytracing.hlsl";
|
|
public const string kStackLitRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/StackLit/StackLitRaytracing.hlsl";
|
|
public const string kStackLitPathtracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/StackLit/StackLitPathTracing.hlsl";
|
|
public const string kHairRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Hair/HairRaytracing.hlsl";
|
|
public const string kHairPathtracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Hair/HairPathTracing.hlsl";
|
|
public const string kTerrainRaytracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/TerrainLit/TerrainLitRaytracing.hlsl";
|
|
public const string kTerrainPathtracing = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/TerrainLit/TerrainLitPathtracing.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";
|
|
public const string kRaytracingLightCluster = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/Shaders/RayTracingLightCluster.hlsl";
|
|
|
|
// Postgraph Raytracing
|
|
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 kPassRaytracingDebug = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassRaytracingDebug.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";
|
|
public const string kHDShadow = "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadow.hlsl";
|
|
public const string kLightLoopDef = "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoopDef.hlsl";
|
|
public const string kPunctualLightCommon = "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/PunctualLightCommon.hlsl";
|
|
public const string kHDShadowLoop = "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/HDShadowLoop.hlsl";
|
|
public const string kHDRaytracingShadowLoop = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RayTracing/Shaders/HDRaytracingShadowLoop.hlsl";
|
|
public const string kNormalSurfaceGradient = "Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl";
|
|
public const string kLighting = "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/Lighting.hlsl";
|
|
public const string kLightLoop = "Packages/com.unity.render-pipelines.high-definition/Runtime/Lighting/LightLoop/LightLoop.hlsl";
|
|
|
|
// Public Pregraph Material
|
|
public const string kUnlit = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Unlit/Unlit.hlsl";
|
|
public const string kLit = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Lit/Lit.hlsl";
|
|
public const string kFabric = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Fabric/Fabric.hlsl";
|
|
public const string kHair = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/Hair/Hair.hlsl";
|
|
public const string kStackLit = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/StackLit/StackLit.hlsl";
|
|
public const string kTerrainLit = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/TerrainLit/TerrainLit.hlsl";
|
|
public const string kSixWayLit = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/SixWayLit/SixWaySmokeLit.hlsl";
|
|
|
|
// Public Pregraph Misc
|
|
public const string kShaderGraphFunctions = "Packages/com.unity.render-pipelines.high-definition/Runtime/ShaderLibrary/ShaderGraphFunctions.hlsl";
|
|
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 const string kPathtracingPlaceholder = "Pathtracing Include Placeholder, replace me !";
|
|
|
|
// Public Postgraph Pass
|
|
public const string kPassLightTransport = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassLightTransport.hlsl";
|
|
public const string kPassDepthOnly = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassDepthOnly.hlsl";
|
|
public const string kPassGBuffer = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassGBuffer.hlsl";
|
|
public const string kPassMotionVectors = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassMotionVectors.hlsl";
|
|
public const string kDisortionVectors = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassDistortion.hlsl";
|
|
public const string kPassForward = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassForward.hlsl";
|
|
public const string kStandardLit = "Packages/com.unity.render-pipelines.high-definition/Runtime/Material/StandardLit/StandardLit.hlsl";
|
|
public const string kPassForwardUnlit = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassForwardUnlit.hlsl";
|
|
public const string kPassConstant = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassConstant.hlsl";
|
|
public const string kPassFullScreenDebug = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassFullScreenDebug.hlsl";
|
|
|
|
public static IncludeCollection MinimalCorePregraph = new IncludeCollection
|
|
{
|
|
{ kShaderVariables, IncludeLocation.Pregraph },
|
|
{ kFragInputs, IncludeLocation.Pregraph },
|
|
};
|
|
|
|
public static IncludeCollection CorePregraph = new IncludeCollection
|
|
{
|
|
{ kDebugDisplay, IncludeLocation.Pregraph },
|
|
{ kMaterial, IncludeLocation.Pregraph },
|
|
};
|
|
|
|
public static IncludeCollection RaytracingCorePregraph = new IncludeCollection
|
|
{
|
|
// Pregraph includes
|
|
{ CoreIncludes.kRaytracingMacros, IncludeLocation.Pregraph },
|
|
{ CoreIncludes.kShaderVariablesRaytracing, IncludeLocation.Pregraph },
|
|
{ CoreIncludes.kMaterial, IncludeLocation.Pregraph },
|
|
{ CoreIncludes.kShaderVariablesRaytracingLightLoop, IncludeLocation.Pregraph },
|
|
};
|
|
|
|
public static IncludeCollection CoreUtility = new IncludeCollection
|
|
{
|
|
{ kBuiltInUtilities, IncludeLocation.Pregraph },
|
|
{ kMaterialUtilities, IncludeLocation.Pregraph },
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region KeywordDescriptors
|
|
static class CoreKeywordDescriptors
|
|
{
|
|
public static KeywordDescriptor WriteNormalBuffer = new KeywordDescriptor()
|
|
{
|
|
displayName = "Write Normal Buffer",
|
|
referenceName = "WRITE_NORMAL_BUFFER",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor WriteMsaaDepth = new KeywordDescriptor()
|
|
{
|
|
displayName = "Write MSAA Depth",
|
|
referenceName = "WRITE_MSAA_DEPTH",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor WriteDecalBufferDepthOnly = new KeywordDescriptor()
|
|
{
|
|
displayName = "Write Decal Buffer (Depth Only)",
|
|
referenceName = "WRITE",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Off", referenceName = "" },
|
|
new KeywordEntry() { displayName = "Decal Buffer", referenceName = "DECAL_BUFFER" },
|
|
new KeywordEntry() { displayName = "Rendering Layer", referenceName = "RENDERING_LAYER" },
|
|
},
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor WriteDecalBufferMotionVector = new KeywordDescriptor()
|
|
{
|
|
displayName = "Write Decal Buffer (Motion Vector)",
|
|
referenceName = "WRITE_DECAL_BUFFER_AND_RENDERING_LAYER",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor DebugDisplay = new KeywordDescriptor()
|
|
{
|
|
displayName = "Debug Display",
|
|
referenceName = "DEBUG_DISPLAY",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor ProceduralInstancing = new KeywordDescriptor()
|
|
{
|
|
displayName = "Procedural Instancing",
|
|
referenceName = "PROCEDURAL_INSTANCING_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor StereoInstancing = new KeywordDescriptor()
|
|
{
|
|
displayName = "Stereo Instancing",
|
|
referenceName = "STEREO_INSTANCING_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor Lightmap = new KeywordDescriptor()
|
|
{
|
|
displayName = "Lightmap",
|
|
referenceName = "LIGHTMAP_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global
|
|
// Caution: 'Optimize Mesh Data' strip away attributes uv1/uv2 without the keyword set on the vertex stage. - so don't define stage frequency here.
|
|
};
|
|
|
|
public static KeywordDescriptor DirectionalLightmapCombined = new KeywordDescriptor()
|
|
{
|
|
displayName = "Directional Lightmap Combined",
|
|
referenceName = "DIRLIGHTMAP_COMBINED",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
// Don't define shader stage frequency
|
|
};
|
|
|
|
public static KeywordDescriptor DynamicLightmap = new KeywordDescriptor()
|
|
{
|
|
displayName = "Dynamic Lightmap",
|
|
referenceName = "DYNAMICLIGHTMAP_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
// Don't define shader stage frequency
|
|
};
|
|
|
|
public static KeywordDescriptor ShadowsShadowmask = new KeywordDescriptor()
|
|
{
|
|
displayName = "Shadows Shadowmask",
|
|
referenceName = "SHADOWS_SHADOWMASK",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
stages = KeywordShaderStage.FragmentAndRaytracing
|
|
};
|
|
|
|
public static KeywordDescriptor ScreenSpaceShadow = new KeywordDescriptor()
|
|
{
|
|
displayName = "ScreenSpaceShadow",
|
|
referenceName = "SCREEN_SPACE_SHADOWS",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Off", referenceName = "OFF" },
|
|
new KeywordEntry() { displayName = "On", referenceName = "ON" },
|
|
},
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor RenderingLayers = new KeywordDescriptor()
|
|
{
|
|
displayName = "Rendering Layers",
|
|
referenceName = "RENDERING_LAYERS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
stages = KeywordShaderStage.FragmentAndRaytracing,
|
|
};
|
|
|
|
public static KeywordDescriptor Decals = new KeywordDescriptor()
|
|
{
|
|
displayName = "Decals",
|
|
referenceName = "DECALS",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Off", referenceName = "OFF" },
|
|
new KeywordEntry() { displayName = "3RT", referenceName = "3RT" },
|
|
new KeywordEntry() { displayName = "4RT", referenceName = "4RT" },
|
|
},
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor DecalsRayTracing = new KeywordDescriptor()
|
|
{
|
|
displayName = "Decals",
|
|
referenceName = "DECALS",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Off", referenceName = "OFF" },
|
|
new KeywordEntry() { displayName = "3RT", referenceName = "3RT" },
|
|
new KeywordEntry() { displayName = "4RT", referenceName = "4RT" },
|
|
},
|
|
stages = KeywordShaderStage.RayTracing,
|
|
};
|
|
|
|
public static KeywordDescriptor ProbeVolumes = new KeywordDescriptor()
|
|
{
|
|
displayName = "ProbeVolumes",
|
|
referenceName = "PROBE_VOLUMES",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Off", referenceName = "" },
|
|
new KeywordEntry() { displayName = "L1", referenceName = "L1" },
|
|
new KeywordEntry() { displayName = "L2", referenceName = "L2" },
|
|
},
|
|
stages = KeywordShaderStage.FragmentAndRaytracing,
|
|
};
|
|
|
|
public static KeywordDescriptor LodFadeCrossfade = new KeywordDescriptor()
|
|
{
|
|
displayName = "LOD Fade Crossfade",
|
|
referenceName = "LOD_FADE_CROSSFADE",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor HasLightloop = new KeywordDescriptor()
|
|
{
|
|
displayName = "Has Lightloop",
|
|
referenceName = "HAS_LIGHTLOOP",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.Predefined,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor LightList = new KeywordDescriptor()
|
|
{
|
|
displayName = "Light List",
|
|
referenceName = "USE",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "FPTL", referenceName = "FPTL_LIGHTLIST" },
|
|
new KeywordEntry() { displayName = "Clustered", referenceName = "CLUSTERED_LIGHTLIST" },
|
|
},
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor DisableLightloopTileAndCluster = new KeywordDescriptor()
|
|
{
|
|
displayName = "Disable Lightloop Tile and Cluster",
|
|
referenceName = "LIGHTLOOP_DISABLE_TILE_AND_CLUSTER",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.Predefined,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor PathTracingclusteredDecals = new KeywordDescriptor()
|
|
{
|
|
displayName = "Cluster decals in the HDRP Path Tracer",
|
|
referenceName = "PATH_TRACING_CLUSTERED_DECALS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.Predefined,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor PunctualShadow = new KeywordDescriptor()
|
|
{
|
|
displayName = "PunctualShadow",
|
|
referenceName = "PUNCTUAL_SHADOW",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Low", referenceName = "LOW" },
|
|
new KeywordEntry() { displayName = "Medium", referenceName = "MEDIUM" },
|
|
new KeywordEntry() { displayName = "High", referenceName = "HIGH" }
|
|
},
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor DirectionalShadow = new KeywordDescriptor()
|
|
{
|
|
displayName = "DirectionalShadow",
|
|
referenceName = "DIRECTIONAL_SHADOW",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Low", referenceName = "LOW" },
|
|
new KeywordEntry() { displayName = "Medium", referenceName = "MEDIUM" },
|
|
new KeywordEntry() { displayName = "High", referenceName = "HIGH" }
|
|
},
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor AreaShadow = new KeywordDescriptor()
|
|
{
|
|
displayName = "AreaShadow",
|
|
referenceName = "AREA_SHADOW",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Medium", referenceName = "MEDIUM" },
|
|
new KeywordEntry() { displayName = "High", referenceName = "HIGH" }
|
|
},
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor SurfaceTypeTransparent = new KeywordDescriptor()
|
|
{
|
|
displayName = "Surface Type Transparent",
|
|
referenceName = "_SURFACE_TYPE_TRANSPARENT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor ShaderLit = new KeywordDescriptor()
|
|
{
|
|
displayName = "Lit shader",
|
|
referenceName = "SHADER_LIT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor DoubleSided = new KeywordDescriptor()
|
|
{
|
|
displayName = "Double Sided",
|
|
referenceName = "_DOUBLESIDED_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor FogOnTransparent = new KeywordDescriptor()
|
|
{
|
|
displayName = "Enable Fog On Transparent",
|
|
referenceName = "_ENABLE_FOG_ON_TRANSPARENT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor ScenePickingPass = new KeywordDescriptor()
|
|
{
|
|
displayName = "Scene Picking Pass",
|
|
referenceName = "SCENEPICKINGPASS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor SceneSelectionPass = new KeywordDescriptor()
|
|
{
|
|
displayName = "Scene Selection Pass",
|
|
referenceName = "SCENESELECTIONPASS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor Tessellation = new KeywordDescriptor()
|
|
{
|
|
displayName = "Tessellation",
|
|
referenceName = "TESSELLATION_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor SupportGlobalMipBias = new KeywordDescriptor()
|
|
{
|
|
displayName = "Support Global Mip Bias",
|
|
referenceName = "SUPPORT_GLOBAL_MIP_BIAS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor TessellationModification = new KeywordDescriptor()
|
|
{
|
|
displayName = "Tessellation Modification",
|
|
referenceName = "HAVE_TESSELLATION_MODIFICATION",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor TessellationMode = new KeywordDescriptor()
|
|
{
|
|
displayName = "Tessellation Mode",
|
|
referenceName = "_TESSELLATION_PHONG",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.Domain,
|
|
};
|
|
|
|
public static KeywordDescriptor TransparentDepthPrepass = new KeywordDescriptor()
|
|
{
|
|
displayName = "Transparent Depth Prepass",
|
|
referenceName = "CUTOFF_TRANSPARENT_DEPTH_PREPASS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor TransparentDepthPostpass = new KeywordDescriptor()
|
|
{
|
|
displayName = "Transparent Depth Postpass",
|
|
referenceName = "CUTOFF_TRANSPARENT_DEPTH_POSTPASS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor SkipRasterizedShadows = new KeywordDescriptor()
|
|
{
|
|
displayName = "Skip Rasterized Shadows",
|
|
referenceName = "SKIP_RASTERIZED_SHADOWS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor AlphaTest = new KeywordDescriptor()
|
|
{
|
|
displayName = "Alpha Test",
|
|
referenceName = "_ALPHATEST_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local
|
|
};
|
|
|
|
public static KeywordDescriptor TransparentColorShadow = new KeywordDescriptor()
|
|
{
|
|
displayName = "Transparent Color Shadow",
|
|
referenceName = "TRANSPARENT_COLOR_SHADOW",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor RaytraceMinimalGBuffer = new KeywordDescriptor()
|
|
{
|
|
displayName = "Minimal GBuffer",
|
|
referenceName = "MINIMAL_GBUFFER",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor DisableDecals = new KeywordDescriptor
|
|
{
|
|
displayName = "Disable Decals",
|
|
referenceName = "_DISABLE_DECALS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.FragmentAndRaytracing,
|
|
};
|
|
|
|
public static KeywordDescriptor DecalSurfaceGradient = new KeywordDescriptor
|
|
{
|
|
displayName = "Additive normal blending",
|
|
referenceName = "DECAL_SURFACE_GRADIENT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor DecalSurfaceGradientRayTracing = new KeywordDescriptor
|
|
{
|
|
displayName = "Additive normal blending",
|
|
referenceName = "DECAL_SURFACE_GRADIENT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
stages = KeywordShaderStage.RayTracing,
|
|
};
|
|
|
|
public static KeywordDescriptor DisableSSR = new KeywordDescriptor
|
|
{
|
|
displayName = "Disable SSR",
|
|
referenceName = "_DISABLE_SSR",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.FragmentAndRaytracing,
|
|
};
|
|
|
|
public static KeywordDescriptor DisableSSRTransparent = new KeywordDescriptor
|
|
{
|
|
displayName = "Disable SSR Transparent",
|
|
referenceName = "_DISABLE_SSR_TRANSPARENT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.FragmentAndRaytracing,
|
|
};
|
|
|
|
public static KeywordDescriptor EnableGeometricSpecularAA = new KeywordDescriptor
|
|
{
|
|
displayName = "Enable Geometric Specular AA",
|
|
referenceName = "_ENABLE_GEOMETRIC_SPECULAR_AA",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.Fragment,
|
|
};
|
|
|
|
public static KeywordDescriptor SupportBlendModePreserveSpecularLighting = new KeywordDescriptor
|
|
{
|
|
displayName = "BlendMode Preserve Specular Lighting",
|
|
referenceName = "SUPPORT_BLENDMODE_PRESERVE_SPECULAR_LIGHTING",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.Predefined,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor AddPrecomputedVelocity = new KeywordDescriptor
|
|
{
|
|
displayName = "Add Precomputed Velocity",
|
|
referenceName = "_ADD_PRECOMPUTED_VELOCITY",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
};
|
|
|
|
public static KeywordDescriptor TransparentWritesMotionVector = new KeywordDescriptor
|
|
{
|
|
displayName = "Transparent Writes Motion Vector",
|
|
referenceName = "_TRANSPARENT",
|
|
type = KeywordType.Enum,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
entries = new KeywordEntry[]
|
|
{
|
|
new KeywordEntry() { displayName = "Off", referenceName = "" },
|
|
new KeywordEntry() { displayName = "Writes Motion Vector", referenceName = "WRITES_MOTION_VEC" },
|
|
new KeywordEntry() { displayName = "Per Pixel Sorting", referenceName = "REFRACTIVE_SORT" },
|
|
}
|
|
};
|
|
|
|
public static KeywordDescriptor DepthOffset = new KeywordDescriptor
|
|
{
|
|
displayName = "Depth Offset",
|
|
referenceName = "_DEPTHOFFSET_ON",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.Fragment
|
|
};
|
|
|
|
public static KeywordDescriptor ConservativeDepthOffset = new KeywordDescriptor
|
|
{
|
|
displayName = "Conservative Depth Offset",
|
|
referenceName = "_CONSERVATIVE_DEPTH_OFFSET",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Local,
|
|
stages = KeywordShaderStage.Fragment
|
|
};
|
|
|
|
public static KeywordDescriptor multiBounceIndirect = new KeywordDescriptor
|
|
{
|
|
displayName = "Multi Bounce Indirect",
|
|
referenceName = "MULTI_BOUNCE_INDIRECT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor EditorVisualization = new KeywordDescriptor
|
|
{
|
|
displayName = "Editor Visualization",
|
|
referenceName = "EDITOR_VISUALIZATION",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.ShaderFeature,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor ForceEnableTransparent = new KeywordDescriptor
|
|
{
|
|
displayName = "Force Enable Transparent",
|
|
referenceName = "_SURFACE_TYPE_TRANSPARENT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.Predefined,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor LineRenderingOffscreenShading = new KeywordDescriptor
|
|
{
|
|
displayName = "Line Rendering Offscreen Shading",
|
|
referenceName = "LINE_RENDERING_OFFSCREEN_SHADING",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.Predefined,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor Native16Bit = new KeywordDescriptor()
|
|
{
|
|
displayName = "Native 16 Bit",
|
|
referenceName = "UNITY_DEVICE_SUPPORTS_NATIVE_16BIT",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global,
|
|
};
|
|
|
|
public static KeywordDescriptor UseLegacyLightmaps = new KeywordDescriptor()
|
|
{
|
|
displayName = "Use Legacy Lightmaps",
|
|
referenceName = "USE_LEGACY_LIGHTMAPS",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global
|
|
};
|
|
|
|
public static KeywordDescriptor LightmapBicubicSampling = new KeywordDescriptor()
|
|
{
|
|
displayName = "Lightmap Bicubic Sampling",
|
|
referenceName = "LIGHTMAP_BICUBIC_SAMPLING",
|
|
type = KeywordType.Boolean,
|
|
definition = KeywordDefinition.MultiCompile,
|
|
scope = KeywordScope.Global
|
|
};
|
|
}
|
|
#endregion
|
|
|
|
#region CustomInterpolators
|
|
static class CoreCustomInterpolators
|
|
{
|
|
public static readonly CustomInterpSubGen.Collection Common = new CustomInterpSubGen.Collection
|
|
{
|
|
CustomInterpSubGen.Descriptor.MakeStruct(CustomInterpSubGen.Splice.k_splicePreInclude, "CustomInterpolators", "USE_CUSTOMINTERP_SUBSTRUCT"),
|
|
CustomInterpSubGen.Descriptor.MakeBlock("CustomInterpolatorVertMeshCustomInterpolation", "varyings", "vertexDescription"),
|
|
CustomInterpSubGen.Descriptor.MakeMacroBlock("CustomInterpolatorInterpolateWithBaryCoordsMeshToDS", "TESSELLATION_INTERPOLATE_BARY(", ", baryCoords)"),
|
|
CustomInterpSubGen.Descriptor.MakeBlock("CustomInterpolatorVertMeshTesselationCustomInterpolation", "output", "input"),
|
|
CustomInterpSubGen.Descriptor.MakeBlock("CustomInterpolatorVaryingsToFragInputs", "output.customInterpolators", "input"),
|
|
CustomInterpSubGen.Descriptor.MakeBlock(CustomInterpSubGen.Splice.k_spliceCopyToSDI, "output", "input.customInterpolators")
|
|
};
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
}
|