Без опису
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

UniversalDecalSubTarget.cs 52KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEditor.ShaderGraph;
  6. using Unity.Rendering.Universal;
  7. using UnityEditor.UIElements;
  8. using UnityEngine.UIElements;
  9. using UnityEditor.ShaderGraph.Legacy;
  10. using UnityEngine.Rendering.Universal;
  11. using UnityEditor.ShaderGraph.Internal;
  12. using ShaderUtils = Unity.Rendering.Universal.ShaderUtils;
  13. namespace UnityEditor.Rendering.Universal.ShaderGraph
  14. {
  15. sealed class UniversalDecalSubTarget : UniversalSubTarget
  16. {
  17. static readonly GUID kSourceCodeGuid = new GUID("f6cdcb0f9c306bf4895b74013d29ed47"); // UniversalDecalSubTarget.cs
  18. internal class Styles
  19. {
  20. public const string header = "Surface Options";
  21. public static GUIContent affectAlbedoText = new GUIContent("Affect BaseColor", "When enabled, this decal uses its base color. When disabled, the decal has no base color effect.");
  22. public static GUIContent affectNormalText = new GUIContent("Affect Normal", "When enabled, this decal uses its normal. When disabled, the decal has no normal effect.");
  23. public static GUIContent affectNormalBlendText = new GUIContent("Affect Normal Blend", "When enabled, this decal uses its normal blending. When disabled, the decal has no normal blending effect.");
  24. public static GUIContent affectMetalText = new GUIContent("Affect Metal", "When enabled, this decal uses the metallic channel of its Mask Map. When disabled, the decal has no metallic effect.");
  25. public static GUIContent affectAmbientOcclusionText = new GUIContent("Affect Ambient Occlusion", "When enabled, this decal uses the smoothness channel of its Mask Map. When disabled, the decal has no smoothness effect.");
  26. public static GUIContent affectSmoothnessText = new GUIContent("Affect Smoothness", "When enabled, this decal uses the ambient occlusion channel of its Mask Map. When disabled, the decal has no ambient occlusion effect.");
  27. public static GUIContent affectEmissionText = new GUIContent("Affect Emission", "When enabled, this decal becomes emissive and appears self-illuminated. Affect Emission does not support Affects Transparent option on Decal Projector.");
  28. public static GUIContent supportLodCrossFadeText = new GUIContent("Support LOD CrossFade", "When enabled, this decal material supports LOD Cross fade if use on a Mesh.");
  29. }
  30. private const string kMaterial = "Material";
  31. private static FieldDescriptor AffectsAlbedo = new FieldDescriptor(kMaterial, "AffectsAlbedo", "");
  32. private static FieldDescriptor AffectsNormal = new FieldDescriptor(kMaterial, "AffectsNormal", "");
  33. private static FieldDescriptor AffectsNormalBlend = new FieldDescriptor(kMaterial, "AffectsNormalBlend", "");
  34. private static FieldDescriptor AffectsMAOS = new FieldDescriptor(kMaterial, "AffectsAO", "");
  35. private static FieldDescriptor AffectsEmission = new FieldDescriptor(kMaterial, "AffectsEmission", "");
  36. private static FieldDescriptor AffectsDBuffer = new FieldDescriptor(kMaterial, "AffectsDBuffer", "");
  37. private static FieldDescriptor DecalDefault = new FieldDescriptor(kMaterial, "DecalDefault", "");
  38. private static FieldDescriptor AngleFade = new FieldDescriptor(kMaterial, "AngleFade", "");
  39. [System.Serializable]
  40. class DecalData
  41. {
  42. public bool affectsAlbedo = true;
  43. public bool affectsNormalBlend = true;
  44. public bool affectsNormal = true;
  45. public bool affectsMAOS;
  46. public bool affectsEmission;
  47. public int drawOrder;
  48. public bool supportLodCrossFade;
  49. public bool angleFade;
  50. }
  51. [SerializeField]
  52. DecalData m_DecalData;
  53. [SerializeField]
  54. private DecalData decalData
  55. {
  56. get
  57. {
  58. if (m_DecalData == null)
  59. m_DecalData = new DecalData();
  60. return m_DecalData;
  61. }
  62. }
  63. public UniversalDecalSubTarget()
  64. {
  65. displayName = "Decal";
  66. }
  67. public override bool IsActive() => true;
  68. protected override ShaderUtils.ShaderID shaderID => ShaderUtils.ShaderID.SG_Decal;
  69. public override void Setup(ref TargetSetupContext context)
  70. {
  71. base.Setup(ref context);
  72. context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency);
  73. context.AddCustomEditorForRenderPipeline("UnityEditor.Rendering.Universal.DecalShaderGraphGUI", typeof(UnityEngine.Rendering.Universal.UniversalRenderPipelineAsset)); // TODO: This should be owned by URP
  74. {
  75. SubShaderDescriptor subShader = SubShaders.Decal(decalData.supportLodCrossFade ? $"{UnityEditor.ShaderGraph.DisableBatching.LODFading}" : $"{UnityEditor.ShaderGraph.DisableBatching.False}");
  76. var passes = new PassCollection();
  77. foreach (var pass in subShader.passes)
  78. {
  79. var passDescriptor = pass.descriptor;
  80. CollectPassRenderState(ref passDescriptor);
  81. passes.Add(passDescriptor, pass.fieldConditions);
  82. }
  83. subShader.passes = passes;
  84. context.AddSubShader(subShader);
  85. }
  86. }
  87. private void CollectPassRenderState(ref PassDescriptor pass)
  88. {
  89. if (pass.lightMode == DecalShaderPassNames.DecalGBufferProjector ||
  90. pass.lightMode == DecalShaderPassNames.DecalGBufferMesh)
  91. {
  92. // Make copy to avoid overwriting static
  93. pass.renderStates = new RenderStateCollection() { pass.renderStates };
  94. if (decalData.affectsAlbedo)
  95. pass.renderStates.Add(RenderState.ColorMask("ColorMask RGB"));
  96. else
  97. pass.renderStates.Add(RenderState.ColorMask("ColorMask 0"));
  98. pass.renderStates.Add(RenderState.ColorMask("ColorMask 0 1"));
  99. if (decalData.affectsNormal)
  100. pass.renderStates.Add(RenderState.ColorMask("ColorMask RGB 2"));
  101. else
  102. pass.renderStates.Add(RenderState.ColorMask("ColorMask 0 2"));
  103. // GI needs it unconditionaly
  104. pass.renderStates.Add(RenderState.ColorMask("ColorMask RGB 3"));
  105. }
  106. if (pass.lightMode == DecalShaderPassNames.DBufferProjector ||
  107. pass.lightMode == DecalShaderPassNames.DBufferMesh)
  108. {
  109. // Make copy to avoid overwriting static
  110. pass.renderStates = new RenderStateCollection() { pass.renderStates };
  111. if (decalData.affectsAlbedo)
  112. pass.renderStates.Add(DecalColorMasks.ColorMaskRGBA0);
  113. else
  114. pass.renderStates.Add(DecalColorMasks.ColorMaskNone0);
  115. if (decalData.affectsNormal)
  116. pass.renderStates.Add(DecalColorMasks.ColorMaskRGBA1);
  117. else
  118. pass.renderStates.Add(DecalColorMasks.ColorMaskNone1);
  119. if (decalData.affectsMAOS)
  120. pass.renderStates.Add(DecalColorMasks.ColorMaskRGBA2);
  121. else
  122. pass.renderStates.Add(DecalColorMasks.ColorMaskNone2);
  123. }
  124. }
  125. public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode)
  126. {
  127. Vector1ShaderProperty drawOrder = new Vector1ShaderProperty();
  128. drawOrder.overrideReferenceName = "_DrawOrder";
  129. drawOrder.displayName = "Draw Order";
  130. drawOrder.floatType = FloatType.Slider;
  131. drawOrder.rangeValues = new Vector2(-50, 50);
  132. drawOrder.hidden = true;
  133. drawOrder.value = 0;
  134. collector.AddShaderProperty(drawOrder);
  135. collector.AddShaderProperty(new Vector1ShaderProperty
  136. {
  137. overrideReferenceName = "_DecalMeshBiasType",
  138. displayName = "DecalMesh BiasType",
  139. floatType = FloatType.Enum,
  140. value = (int)DecalMeshDepthBiasType.DepthBias,
  141. enumNames = { "Depth Bias", "View Bias" },
  142. enumValues = { (int)DecalMeshDepthBiasType.DepthBias, (int)DecalMeshDepthBiasType.ViewBias },
  143. hidden = true
  144. });
  145. Vector1ShaderProperty decalMeshDepthBias = new Vector1ShaderProperty();
  146. decalMeshDepthBias.overrideReferenceName = "_DecalMeshDepthBias";
  147. decalMeshDepthBias.displayName = "DecalMesh DepthBias";
  148. decalMeshDepthBias.hidden = true;
  149. decalMeshDepthBias.floatType = FloatType.Default;
  150. decalMeshDepthBias.value = 0;
  151. collector.AddShaderProperty(decalMeshDepthBias);
  152. Vector1ShaderProperty decalMeshViewBias = new Vector1ShaderProperty();
  153. decalMeshViewBias.overrideReferenceName = "_DecalMeshViewBias";
  154. decalMeshViewBias.displayName = "DecalMesh ViewBias";
  155. decalMeshViewBias.hidden = true;
  156. decalMeshViewBias.floatType = FloatType.Default;
  157. decalMeshViewBias.value = 0;
  158. collector.AddShaderProperty(decalMeshViewBias);
  159. if (decalData.angleFade)
  160. {
  161. Vector1ShaderProperty decalAngleFadeSupported = new Vector1ShaderProperty();
  162. decalAngleFadeSupported.overrideReferenceName = "_DecalAngleFadeSupported";
  163. decalAngleFadeSupported.displayName = "Decal Angle Fade Supported";
  164. decalAngleFadeSupported.hidden = true;
  165. decalAngleFadeSupported.floatType = FloatType.Default;
  166. decalAngleFadeSupported.value = 1;
  167. collector.AddShaderProperty(decalAngleFadeSupported);
  168. }
  169. }
  170. public override void GetFields(ref TargetFieldContext context)
  171. {
  172. // Decal properties
  173. context.AddField(AffectsAlbedo, decalData.affectsAlbedo);
  174. context.AddField(AffectsNormal, decalData.affectsNormal);
  175. context.AddField(AffectsNormalBlend, decalData.affectsNormalBlend);
  176. context.AddField(AffectsMAOS, decalData.affectsMAOS);
  177. context.AddField(AffectsEmission, decalData.affectsEmission);
  178. context.AddField(AffectsDBuffer, decalData.affectsAlbedo || decalData.affectsNormal || decalData.affectsMAOS);
  179. context.AddField(DecalDefault, decalData.affectsAlbedo || decalData.affectsNormal || decalData.affectsMAOS || decalData.affectsEmission);
  180. context.AddField(Fields.LodCrossFade, decalData.supportLodCrossFade);
  181. context.AddField(AngleFade, decalData.angleFade);
  182. }
  183. public override void GetActiveBlocks(ref TargetActiveBlockContext context)
  184. {
  185. // Vertex
  186. context.AddBlock(BlockFields.VertexDescription.Position);
  187. context.AddBlock(BlockFields.VertexDescription.Normal);
  188. context.AddBlock(BlockFields.VertexDescription.Tangent);
  189. // Decal
  190. context.AddBlock(BlockFields.SurfaceDescription.BaseColor, decalData.affectsAlbedo);
  191. context.AddBlock(BlockFields.SurfaceDescription.Alpha, decalData.affectsAlbedo || decalData.affectsEmission);
  192. context.AddBlock(BlockFields.SurfaceDescription.NormalTS, decalData.affectsNormal);
  193. context.AddBlock(UniversalBlockFields.SurfaceDescription.NormalAlpha, decalData.affectsNormal && decalData.affectsNormalBlend);
  194. context.AddBlock(BlockFields.SurfaceDescription.Metallic, decalData.affectsMAOS);
  195. context.AddBlock(BlockFields.SurfaceDescription.Occlusion, decalData.affectsMAOS);
  196. context.AddBlock(BlockFields.SurfaceDescription.Smoothness, decalData.affectsMAOS);
  197. context.AddBlock(UniversalBlockFields.SurfaceDescription.MAOSAlpha, decalData.affectsMAOS);
  198. context.AddBlock(BlockFields.SurfaceDescription.Emission, decalData.affectsEmission);
  199. }
  200. public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action<String> registerUndo)
  201. {
  202. context.AddProperty("Affect BaseColor", new Toggle() { value = decalData.affectsAlbedo }, (evt) =>
  203. {
  204. if (Equals(decalData.affectsAlbedo, evt.newValue))
  205. return;
  206. registerUndo("Change Affect BaseColor");
  207. decalData.affectsAlbedo = (bool)evt.newValue;
  208. onChange();
  209. });
  210. context.AddProperty("Affect Normal", new Toggle() { value = decalData.affectsNormal }, (evt) =>
  211. {
  212. if (Equals(decalData.affectsNormal, evt.newValue))
  213. return;
  214. registerUndo("Change Affects Normal");
  215. decalData.affectsNormal = (bool)evt.newValue;
  216. onChange();
  217. });
  218. context.globalIndentLevel++;
  219. context.AddProperty("Blend", new Toggle() { value = decalData.affectsNormalBlend }, (evt) =>
  220. {
  221. if (Equals(decalData.affectsNormalBlend, evt.newValue))
  222. return;
  223. registerUndo("Change Affects Normal Blend");
  224. decalData.affectsNormalBlend = (bool)evt.newValue;
  225. onChange();
  226. });
  227. context.globalIndentLevel--;
  228. context.AddProperty("Affect MAOS", new Toggle() { value = decalData.affectsMAOS }, (evt) =>
  229. {
  230. if (Equals(decalData.affectsMAOS, evt.newValue))
  231. return;
  232. registerUndo("Change Affect MAOS");
  233. decalData.affectsMAOS = (bool)evt.newValue;
  234. onChange();
  235. });
  236. context.AddProperty("Affect Emission", new Toggle() { value = decalData.affectsEmission }, (evt) =>
  237. {
  238. if (Equals(decalData.affectsEmission, evt.newValue))
  239. return;
  240. registerUndo("Change Affect Emission");
  241. decalData.affectsEmission = (bool)evt.newValue;
  242. onChange();
  243. });
  244. context.AddProperty("Supports LOD Cross Fade", new Toggle() { value = decalData.supportLodCrossFade }, (evt) =>
  245. {
  246. if (Equals(decalData.supportLodCrossFade, evt.newValue))
  247. return;
  248. registerUndo("Change Supports LOD Cross Fade");
  249. decalData.supportLodCrossFade = (bool)evt.newValue;
  250. onChange();
  251. });
  252. context.AddProperty("Angle Fade", new Toggle() { value = decalData.angleFade }, (evt) =>
  253. {
  254. if (Equals(decalData.angleFade, evt.newValue))
  255. return;
  256. registerUndo("Change Angle Fade");
  257. decalData.angleFade = (bool)evt.newValue;
  258. onChange();
  259. });
  260. }
  261. #region SubShader
  262. static class SubShaders
  263. {
  264. public static SubShaderDescriptor Decal(string disableBatchingTag)
  265. {
  266. return new SubShaderDescriptor()
  267. {
  268. pipelineTag = UniversalTarget.kPipelineTag,
  269. customTags = "\"PreviewType\"=\"Plane\"",
  270. disableBatchingTag = disableBatchingTag,
  271. generatesPreview = true,
  272. passes = new PassCollection
  273. {
  274. { DecalPasses.DBufferProjector, new FieldCondition(AffectsDBuffer, true) },
  275. { DecalPasses.ForwardEmissiveProjector, new FieldCondition(AffectsEmission, true) },
  276. { DecalPasses.ScreenSpaceProjector, new FieldCondition(DecalDefault, true) },
  277. { DecalPasses.GBufferProjector, new FieldCondition(DecalDefault, true) },
  278. { DecalPasses.DBufferMesh, new FieldCondition(AffectsDBuffer, true) },
  279. { DecalPasses.ForwardEmissiveMesh, new FieldCondition(AffectsEmission, true) },
  280. { DecalPasses.ScreenSpaceMesh, new FieldCondition(DecalDefault, true) },
  281. { DecalPasses.GBufferMesh, new FieldCondition(DecalDefault, true) },
  282. { DecalPasses.ScenePicking, new FieldCondition(DecalDefault, true) },
  283. },
  284. };
  285. }
  286. }
  287. #endregion
  288. #region Passes
  289. static class DecalPasses
  290. {
  291. public static PassDescriptor ScenePicking = GetScenePicking(DecalPragmas.Instanced);
  292. public static PassDescriptor GetScenePicking(PragmaCollection pragma)
  293. {
  294. return new PassDescriptor
  295. {
  296. // Definition
  297. displayName = "ScenePickingPass",
  298. referenceName = "SHADERPASS_DEPTHONLY",
  299. lightMode = "Picking",
  300. useInPreview = false,
  301. // Template
  302. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  303. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  304. // Collections
  305. renderStates = DecalRenderStates.ScenePicking,
  306. pragmas = pragma,
  307. defines = DecalDefines.ScenePicking,
  308. includes = DecalIncludes.ScenePicking,
  309. structs = CoreStructCollections.Default,
  310. fieldDependencies = CoreFieldDependencies.Default,
  311. };
  312. }
  313. public static PassDescriptor DBufferProjector = new PassDescriptor()
  314. {
  315. // Definition
  316. displayName = DecalShaderPassNames.DBufferProjector,
  317. referenceName = "SHADERPASS_DBUFFER_PROJECTOR",
  318. lightMode = DecalShaderPassNames.DBufferProjector,
  319. useInPreview = false,
  320. // Template
  321. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  322. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  323. // Port mask
  324. validPixelBlocks = DecalBlockMasks.FragmentWithoutEmessive,
  325. //Fields
  326. structs = CoreStructCollections.Default,
  327. fieldDependencies = CoreFieldDependencies.Default,
  328. renderStates = DecalRenderStates.DBufferProjector,
  329. pragmas = DecalPragmas.MultipleRenderTargets,
  330. keywords = DecalKeywords.DBufferProjector,
  331. defines = DecalDefines.Projector,
  332. includes = DecalIncludes.DBuffer,
  333. };
  334. public static PassDescriptor ForwardEmissiveProjector = new PassDescriptor()
  335. {
  336. // Definition
  337. displayName = DecalShaderPassNames.DecalProjectorForwardEmissive,
  338. referenceName = "SHADERPASS_FORWARD_EMISSIVE_PROJECTOR",
  339. lightMode = DecalShaderPassNames.DecalProjectorForwardEmissive,
  340. useInPreview = false,
  341. // Template
  342. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  343. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  344. // Port mask
  345. validPixelBlocks = DecalBlockMasks.ForwardOnlyEmissive,
  346. //Fields
  347. structs = CoreStructCollections.Default,
  348. fieldDependencies = CoreFieldDependencies.Default,
  349. // Conditional State
  350. renderStates = DecalRenderStates.ForwardEmissiveProjector,
  351. pragmas = DecalPragmas.MultipleRenderTargets,
  352. defines = DecalDefines.ProjectorWithEmission,
  353. keywords = DecalKeywords.ForwardEmissiveProjector,
  354. includes = DecalIncludes.DBuffer,
  355. };
  356. public static PassDescriptor ScreenSpaceProjector = GetScreenSpaceProjector(DecalPragmas.ScreenSpace, DecalKeywords.ScreenSpaceProjector);
  357. public static PassDescriptor GetScreenSpaceProjector(PragmaCollection pragma, KeywordCollection keywords)
  358. {
  359. return new PassDescriptor
  360. {
  361. // Definition
  362. displayName = DecalShaderPassNames.DecalScreenSpaceProjector,
  363. referenceName = "SHADERPASS_DECAL_SCREEN_SPACE_PROJECTOR",
  364. lightMode = DecalShaderPassNames.DecalScreenSpaceProjector,
  365. useInPreview = false,
  366. // Template
  367. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  368. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  369. // Port mask
  370. validPixelBlocks = DecalBlockMasks.Fragment,
  371. //Fields
  372. structs = CoreStructCollections.Default,
  373. requiredFields = DecalRequiredFields.ScreenSpaceProjector,
  374. fieldDependencies = CoreFieldDependencies.Default,
  375. renderStates = DecalRenderStates.ScreenSpaceProjector,
  376. pragmas = pragma,
  377. defines = DecalDefines.ProjectorWithEmission,
  378. keywords = keywords,
  379. includes = DecalIncludes.ScreenSpace,
  380. };
  381. }
  382. public static PassDescriptor GBufferProjector = new PassDescriptor()
  383. {
  384. // Definition
  385. displayName = DecalShaderPassNames.DecalGBufferProjector,
  386. referenceName = "SHADERPASS_DECAL_GBUFFER_PROJECTOR",
  387. lightMode = DecalShaderPassNames.DecalGBufferProjector,
  388. useInPreview = false,
  389. // Template
  390. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  391. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  392. // Port mask
  393. validPixelBlocks = DecalBlockMasks.Fragment,
  394. //Fields
  395. structs = CoreStructCollections.Default,
  396. requiredFields = DecalRequiredFields.GBufferProjector,
  397. fieldDependencies = CoreFieldDependencies.Default,
  398. renderStates = DecalRenderStates.GBufferProjector,
  399. pragmas = DecalPragmas.GBuffer,
  400. defines = DecalDefines.ProjectorWithEmission,
  401. keywords = DecalKeywords.GBufferProjector,
  402. includes = DecalIncludes.GBuffer,
  403. };
  404. public static PassDescriptor DBufferMesh = new PassDescriptor()
  405. {
  406. // Definition
  407. displayName = DecalShaderPassNames.DBufferMesh,
  408. referenceName = "SHADERPASS_DBUFFER_MESH",
  409. lightMode = DecalShaderPassNames.DBufferMesh,
  410. useInPreview = false,
  411. // Template
  412. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  413. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  414. // Port mask
  415. validPixelBlocks = DecalBlockMasks.FragmentWithoutEmessive,
  416. //Fields
  417. structs = CoreStructCollections.Default,
  418. requiredFields = DecalRequiredFields.Mesh,
  419. fieldDependencies = CoreFieldDependencies.Default,
  420. // Conditional State
  421. renderStates = DecalRenderStates.DBufferMesh,
  422. pragmas = DecalPragmas.MultipleRenderTargets,
  423. defines = DecalDefines.Mesh,
  424. keywords = DecalKeywords.DBufferMesh,
  425. includes = DecalIncludes.DBuffer,
  426. };
  427. public static PassDescriptor ForwardEmissiveMesh = new PassDescriptor()
  428. {
  429. // Definition
  430. displayName = DecalShaderPassNames.DecalMeshForwardEmissive,
  431. referenceName = "SHADERPASS_FORWARD_EMISSIVE_MESH",
  432. lightMode = DecalShaderPassNames.DecalMeshForwardEmissive,
  433. useInPreview = false,
  434. // Template
  435. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  436. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  437. // Port mask
  438. validPixelBlocks = DecalBlockMasks.Fragment,
  439. //Fields
  440. structs = CoreStructCollections.Default,
  441. requiredFields = DecalRequiredFields.Mesh,
  442. fieldDependencies = CoreFieldDependencies.Default,
  443. // Conditional State
  444. renderStates = DecalRenderStates.ForwardEmissiveMesh,
  445. pragmas = DecalPragmas.MultipleRenderTargets,
  446. defines = DecalDefines.MeshWithEmission,
  447. keywords = DecalKeywords.ForwardEmissiveProjector,
  448. includes = DecalIncludes.DBuffer,
  449. };
  450. public static PassDescriptor ScreenSpaceMesh = GetScreenSpaceMesh(DecalPragmas.ScreenSpace, DecalKeywords.ScreenSpaceMesh);
  451. public static PassDescriptor GetScreenSpaceMesh(PragmaCollection pragma, KeywordCollection keywords)
  452. {
  453. return new PassDescriptor
  454. {
  455. // Definition
  456. displayName = DecalShaderPassNames.DecalScreenSpaceMesh,
  457. referenceName = "SHADERPASS_DECAL_SCREEN_SPACE_MESH",
  458. lightMode = DecalShaderPassNames.DecalScreenSpaceMesh,
  459. useInPreview = true,
  460. // Template
  461. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  462. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  463. // Port mask
  464. validPixelBlocks = DecalBlockMasks.Fragment, // todo
  465. //Fields
  466. structs = CoreStructCollections.Default,
  467. requiredFields = DecalRequiredFields.ScreenSpaceMesh,
  468. fieldDependencies = CoreFieldDependencies.Default,
  469. renderStates = DecalRenderStates.ScreenSpaceMesh,
  470. pragmas = pragma,
  471. defines = DecalDefines.MeshWithEmission,
  472. keywords = keywords,
  473. includes = DecalIncludes.ScreenSpace,
  474. };
  475. }
  476. public static PassDescriptor GBufferMesh = new PassDescriptor()
  477. {
  478. // Definition
  479. displayName = DecalShaderPassNames.DecalGBufferMesh,
  480. referenceName = "SHADERPASS_DECAL_GBUFFER_MESH",
  481. lightMode = DecalShaderPassNames.DecalGBufferMesh,
  482. useInPreview = false,
  483. // Template
  484. passTemplatePath = "Packages/com.unity.render-pipelines.universal/Editor/Decal/DecalPass.template",
  485. sharedTemplateDirectories = GenerationUtils.GetDefaultSharedTemplateDirectories(),
  486. // Port mask
  487. validPixelBlocks = DecalBlockMasks.Fragment, // todo
  488. //Fields
  489. structs = CoreStructCollections.Default,
  490. requiredFields = DecalRequiredFields.ScreenSpaceMesh,
  491. fieldDependencies = CoreFieldDependencies.Default,
  492. renderStates = DecalRenderStates.GBufferMesh,
  493. pragmas = DecalPragmas.GBuffer,
  494. defines = DecalDefines.MeshWithEmission,
  495. keywords = DecalKeywords.GBufferMesh,
  496. includes = DecalIncludes.GBuffer,
  497. };
  498. }
  499. #endregion
  500. #region PortMasks
  501. static class DecalBlockMasks
  502. {
  503. public static BlockFieldDescriptor[] FragmentWithoutEmessive = new BlockFieldDescriptor[]
  504. {
  505. BlockFields.SurfaceDescription.BaseColor,
  506. BlockFields.SurfaceDescription.Alpha,
  507. BlockFields.SurfaceDescription.NormalTS,
  508. UniversalBlockFields.SurfaceDescription.NormalAlpha,
  509. BlockFields.SurfaceDescription.Metallic,
  510. BlockFields.SurfaceDescription.Occlusion,
  511. BlockFields.SurfaceDescription.Smoothness,
  512. UniversalBlockFields.SurfaceDescription.MAOSAlpha,
  513. };
  514. public static BlockFieldDescriptor[] ForwardOnlyEmissive = new BlockFieldDescriptor[]
  515. {
  516. BlockFields.SurfaceDescription.Alpha,
  517. BlockFields.SurfaceDescription.Emission,
  518. };
  519. public static BlockFieldDescriptor[] Fragment = new BlockFieldDescriptor[]
  520. {
  521. BlockFields.SurfaceDescription.BaseColor,
  522. BlockFields.SurfaceDescription.Alpha,
  523. BlockFields.SurfaceDescription.NormalTS,
  524. UniversalBlockFields.SurfaceDescription.NormalAlpha,
  525. BlockFields.SurfaceDescription.Metallic,
  526. BlockFields.SurfaceDescription.Occlusion,
  527. BlockFields.SurfaceDescription.Smoothness,
  528. UniversalBlockFields.SurfaceDescription.MAOSAlpha,
  529. BlockFields.SurfaceDescription.Emission,
  530. };
  531. }
  532. #endregion
  533. #region RequiredFields
  534. static class DecalRequiredFields
  535. {
  536. public static FieldCollection Mesh = new FieldCollection()
  537. {
  538. StructFields.Attributes.normalOS,
  539. StructFields.Attributes.tangentOS,
  540. StructFields.Attributes.uv1,
  541. StructFields.Attributes.uv2,
  542. StructFields.Varyings.normalWS,
  543. StructFields.Varyings.tangentWS,
  544. StructFields.Varyings.positionWS,
  545. StructFields.Varyings.texCoord0,
  546. };
  547. public static FieldCollection ScreenSpaceProjector = new FieldCollection()
  548. {
  549. StructFields.Varyings.normalWS,
  550. UniversalStructFields.Varyings.staticLightmapUV,
  551. UniversalStructFields.Varyings.dynamicLightmapUV,
  552. UniversalStructFields.Varyings.sh,
  553. UniversalStructFields.Varyings.probeOcclusion,
  554. UniversalStructFields.Varyings.fogFactorAndVertexLight, // fog and vertex lighting, vert input is dependency
  555. // todo
  556. //UniversalStructFields.Varyings.shadowCoord, // shadow coord, vert input is dependency
  557. };
  558. public static FieldCollection GBufferProjector = new FieldCollection()
  559. {
  560. StructFields.Varyings.normalWS,
  561. UniversalStructFields.Varyings.staticLightmapUV,
  562. UniversalStructFields.Varyings.dynamicLightmapUV,
  563. UniversalStructFields.Varyings.sh,
  564. UniversalStructFields.Varyings.probeOcclusion,
  565. // todo
  566. //UniversalStructFields.Varyings.shadowCoord, // shadow coord, vert input is dependency
  567. };
  568. public static FieldCollection ScreenSpaceMesh = new FieldCollection()
  569. {
  570. StructFields.Attributes.normalOS,
  571. StructFields.Attributes.tangentOS,
  572. StructFields.Attributes.uv1,
  573. StructFields.Attributes.uv2,
  574. StructFields.Varyings.normalWS,
  575. StructFields.Varyings.tangentWS,
  576. StructFields.Varyings.positionWS,
  577. StructFields.Varyings.texCoord0,
  578. UniversalStructFields.Varyings.staticLightmapUV,
  579. UniversalStructFields.Varyings.dynamicLightmapUV,
  580. UniversalStructFields.Varyings.sh,
  581. UniversalStructFields.Varyings.probeOcclusion,
  582. UniversalStructFields.Varyings.fogFactorAndVertexLight, // fog and vertex lighting, vert input is dependency
  583. // todo
  584. //UniversalStructFields.Varyings.shadowCoord, // shadow coord, vert input is dependency
  585. };
  586. }
  587. #endregion
  588. #region ColorMask
  589. static class DecalColorMasks
  590. {
  591. public static RenderStateDescriptor ColorMaskRGBA0 = RenderState.ColorMask("ColorMask RGBA");
  592. public static RenderStateDescriptor ColorMaskNone0 = RenderState.ColorMask("ColorMask 0");
  593. public static RenderStateDescriptor ColorMaskRGBA1 = RenderState.ColorMask("ColorMask RGBA 1");
  594. public static RenderStateDescriptor ColorMaskNone1 = RenderState.ColorMask("ColorMask 0 1");
  595. public static RenderStateDescriptor ColorMaskRGBA2 = RenderState.ColorMask("ColorMask RGBA 2");
  596. public static RenderStateDescriptor ColorMaskNone2 = RenderState.ColorMask("ColorMask 0 2");
  597. }
  598. #endregion
  599. #region RenderStates
  600. static class DecalRenderStates
  601. {
  602. private readonly static string[] s_DBufferBlends = new string[]
  603. {
  604. "Blend 0 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha",
  605. "Blend 1 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha",
  606. "Blend 2 SrcAlpha OneMinusSrcAlpha, Zero OneMinusSrcAlpha",
  607. };
  608. private readonly static string[] s_GBufferBlends = new string[]
  609. {
  610. "Blend 0 SrcAlpha OneMinusSrcAlpha",
  611. "Blend 1 SrcAlpha OneMinusSrcAlpha",
  612. "Blend 2 SrcAlpha OneMinusSrcAlpha",
  613. "Blend 3 SrcAlpha OneMinusSrcAlpha",
  614. };
  615. public static RenderStateCollection ScenePicking = new RenderStateCollection
  616. {
  617. { RenderState.Cull(Cull.Back) },
  618. };
  619. public static RenderStateCollection DBufferProjector = new RenderStateCollection
  620. {
  621. { RenderState.Blend(s_DBufferBlends[0]) },
  622. { RenderState.Blend(s_DBufferBlends[1]) },
  623. { RenderState.Blend(s_DBufferBlends[2]) },
  624. { RenderState.Cull(Cull.Front) },
  625. { RenderState.ZTest(ZTest.Greater) },
  626. { RenderState.ZWrite(ZWrite.Off) },
  627. };
  628. public static RenderStateCollection ForwardEmissiveProjector = new RenderStateCollection
  629. {
  630. { RenderState.Blend("Blend 0 SrcAlpha One") },
  631. { RenderState.Cull(Cull.Front) },
  632. { RenderState.ZTest(ZTest.Greater) },
  633. { RenderState.ZWrite(ZWrite.Off) },
  634. };
  635. public static RenderStateCollection ScreenSpaceProjector = new RenderStateCollection
  636. {
  637. { RenderState.Blend("Blend SrcAlpha OneMinusSrcAlpha") },
  638. { RenderState.Cull(Cull.Front) },
  639. { RenderState.ZTest(ZTest.Greater) },
  640. { RenderState.ZWrite(ZWrite.Off) },
  641. };
  642. public static RenderStateCollection GBufferProjector = new RenderStateCollection
  643. {
  644. { RenderState.Blend(s_GBufferBlends[0]) },
  645. { RenderState.Blend(s_GBufferBlends[1]) },
  646. { RenderState.Blend(s_GBufferBlends[2]) },
  647. { RenderState.Blend(s_GBufferBlends[3]) },
  648. { RenderState.Cull(Cull.Front) },
  649. { RenderState.ZTest(ZTest.Greater) },
  650. { RenderState.ZWrite(ZWrite.Off) },
  651. };
  652. public static RenderStateCollection DBufferMesh = new RenderStateCollection
  653. {
  654. { RenderState.Blend(s_DBufferBlends[0]) },
  655. { RenderState.Blend(s_DBufferBlends[1]) },
  656. { RenderState.Blend(s_DBufferBlends[2]) },
  657. { RenderState.ZTest(ZTest.LEqual) },
  658. { RenderState.ZWrite(ZWrite.Off) },
  659. };
  660. public static RenderStateCollection ForwardEmissiveMesh = new RenderStateCollection
  661. {
  662. { RenderState.Blend("Blend 0 SrcAlpha One") },
  663. { RenderState.ZTest(ZTest.LEqual) },
  664. { RenderState.ZWrite(ZWrite.Off) },
  665. };
  666. public static RenderStateCollection ScreenSpaceMesh = new RenderStateCollection
  667. {
  668. { RenderState.Blend("Blend SrcAlpha OneMinusSrcAlpha") },
  669. { RenderState.ZTest(ZTest.LEqual) },
  670. { RenderState.ZWrite(ZWrite.Off) },
  671. };
  672. public static RenderStateCollection GBufferMesh = new RenderStateCollection
  673. {
  674. { RenderState.Blend(s_GBufferBlends[0]) },
  675. { RenderState.Blend(s_GBufferBlends[1]) },
  676. { RenderState.Blend(s_GBufferBlends[2]) },
  677. { RenderState.Blend(s_GBufferBlends[3]) },
  678. { RenderState.ZWrite(ZWrite.Off) },
  679. };
  680. }
  681. #endregion
  682. #region Pragmas
  683. static class DecalPragmas
  684. {
  685. public static PragmaCollection ScreenSpace = new PragmaCollection
  686. {
  687. { Pragma.Target(ShaderModel.Target25) },
  688. { Pragma.Vertex("Vert") },
  689. { Pragma.Fragment("Frag") },
  690. { Pragma.MultiCompileInstancing },
  691. { Pragma.MultiCompileFog },
  692. { Pragma.EditorSyncCompilation },
  693. };
  694. public static PragmaCollection GBuffer = new PragmaCollection
  695. {
  696. { Pragma.Target(ShaderModel.Target45) }, // MRT4
  697. { Pragma.ExcludeRenderers(new[] { Platform.GLES3, Platform.GLCore }) },
  698. { Pragma.Vertex("Vert") },
  699. { Pragma.Fragment("Frag") },
  700. { Pragma.MultiCompileInstancing },
  701. { Pragma.MultiCompileFog },
  702. { Pragma.EditorSyncCompilation },
  703. };
  704. public static PragmaCollection MultipleRenderTargets = new PragmaCollection
  705. {
  706. { Pragma.Target(ShaderModel.Target45) }, // MRT4
  707. { Pragma.ExcludeRenderers(new[] { Platform.GLES3, Platform.GLCore }) },
  708. { Pragma.Vertex("Vert") },
  709. { Pragma.Fragment("Frag") },
  710. { Pragma.MultiCompileInstancing },
  711. { Pragma.EditorSyncCompilation },
  712. };
  713. public static readonly PragmaCollection Instanced = new PragmaCollection
  714. {
  715. { Pragma.Target(ShaderModel.Target20) },
  716. { Pragma.MultiCompileInstancing },
  717. { Pragma.EditorSyncCompilation },
  718. { Pragma.Vertex("Vert") },
  719. { Pragma.Fragment("Frag") },
  720. };
  721. }
  722. #endregion
  723. #region Defines
  724. static class DecalDefines
  725. {
  726. private static class Descriptors
  727. {
  728. public static KeywordDescriptor AffectsAlbedo = new KeywordDescriptor()
  729. {
  730. displayName = "Affects Albedo",
  731. referenceName = "_MATERIAL_AFFECTS_ALBEDO",
  732. type = KeywordType.Boolean,
  733. };
  734. public static KeywordDescriptor AffectsNormal = new KeywordDescriptor()
  735. {
  736. displayName = "Affects Normal",
  737. referenceName = "_MATERIAL_AFFECTS_NORMAL",
  738. type = KeywordType.Boolean,
  739. };
  740. public static KeywordDescriptor AffectsNormalBlend = new KeywordDescriptor()
  741. {
  742. displayName = "Affects Normal Blend",
  743. referenceName = "_MATERIAL_AFFECTS_NORMAL_BLEND",
  744. type = KeywordType.Boolean,
  745. };
  746. public static KeywordDescriptor AffectsMAOS = new KeywordDescriptor()
  747. {
  748. displayName = "Affects Metal",
  749. referenceName = "_MATERIAL_AFFECTS_MAOS",
  750. type = KeywordType.Boolean,
  751. };
  752. public static KeywordDescriptor AffectsEmission = new KeywordDescriptor()
  753. {
  754. displayName = "Affects Emission",
  755. referenceName = "_MATERIAL_AFFECTS_EMISSION",
  756. type = KeywordType.Boolean,
  757. };
  758. public static KeywordDescriptor AngleFade = new KeywordDescriptor()
  759. {
  760. displayName = "Angle Fade",
  761. referenceName = "DECAL_ANGLE_FADE",
  762. type = KeywordType.Boolean,
  763. };
  764. public static KeywordDescriptor ScenePickingPass = new KeywordDescriptor()
  765. {
  766. displayName = "Scene Picking Pass",
  767. referenceName = "SCENEPICKINGPASS",
  768. type = KeywordType.Boolean,
  769. };
  770. }
  771. public static DefineCollection Projector = new DefineCollection
  772. {
  773. { Descriptors.AffectsAlbedo, 1, new FieldCondition(AffectsAlbedo, true) },
  774. { Descriptors.AffectsNormal, 1, new FieldCondition(AffectsNormal, true) },
  775. { Descriptors.AffectsNormalBlend, 1, new FieldCondition(AffectsNormalBlend, true) },
  776. { Descriptors.AffectsMAOS, 1, new FieldCondition(AffectsMAOS, true) },
  777. { Descriptors.AngleFade, 1, new FieldCondition(AngleFade, true) }
  778. };
  779. public static DefineCollection ProjectorEmission = new DefineCollection
  780. {
  781. { Descriptors.AngleFade, 1, new FieldCondition(AngleFade, true) },
  782. { Descriptors.AffectsEmission, 1, new FieldCondition(AffectsEmission, true) },
  783. };
  784. public static DefineCollection ProjectorWithEmission = new DefineCollection
  785. {
  786. { Projector },
  787. { Descriptors.AffectsEmission, 1, new FieldCondition(AffectsEmission, true) },
  788. };
  789. public static DefineCollection Mesh = new DefineCollection
  790. {
  791. { Descriptors.AffectsAlbedo, 1, new FieldCondition(AffectsAlbedo, true) },
  792. { Descriptors.AffectsNormal, 1, new FieldCondition(AffectsNormal, true) },
  793. { Descriptors.AffectsNormalBlend, 1, new FieldCondition(AffectsNormalBlend, true) },
  794. { Descriptors.AffectsMAOS, 1, new FieldCondition(AffectsMAOS, true) },
  795. { CoreKeywordDescriptors.UseUnityCrossFade, 1, new FieldCondition(Fields.LodCrossFade, true) }
  796. };
  797. public static DefineCollection MeshEmission = new DefineCollection
  798. {
  799. { Descriptors.AffectsEmission, 1, new FieldCondition(AffectsEmission, true) },
  800. };
  801. public static DefineCollection MeshWithEmission = new DefineCollection
  802. {
  803. { Mesh },
  804. { Descriptors.AffectsEmission, 1, new FieldCondition(AffectsEmission, true) },
  805. };
  806. public static DefineCollection ScenePicking = new DefineCollection { { Descriptors.ScenePickingPass, 1 }, };
  807. }
  808. #endregion
  809. #region Keywords
  810. static class DecalKeywords
  811. {
  812. static class Descriptors
  813. {
  814. public static KeywordDescriptor DecalsNormalBlend = new KeywordDescriptor()
  815. {
  816. displayName = "Decal Normal Blend",
  817. referenceName = "_DECAL_NORMAL_BLEND",
  818. type = KeywordType.Enum,
  819. definition = KeywordDefinition.MultiCompile,
  820. scope = KeywordScope.Global,
  821. entries = new KeywordEntry[]
  822. {
  823. new KeywordEntry() { displayName = "LOW", referenceName = "LOW" },
  824. new KeywordEntry() { displayName = "MEDIUM", referenceName = "MEDIUM" },
  825. new KeywordEntry() { displayName = "HIGH", referenceName = "HIGH" },
  826. }
  827. };
  828. public static readonly KeywordDescriptor DecalLayers = new KeywordDescriptor()
  829. {
  830. displayName = "Decal Layers",
  831. referenceName = "_DECAL_LAYERS",
  832. type = KeywordType.Boolean,
  833. definition = KeywordDefinition.MultiCompile,
  834. scope = KeywordScope.Global,
  835. };
  836. }
  837. public static KeywordCollection DBufferMesh = new KeywordCollection
  838. {
  839. { CoreKeywordDescriptors.DBuffer },
  840. { CoreKeywordDescriptors.LODFadeCrossFade, new FieldCondition(Fields.LodCrossFade, true) },
  841. { Descriptors.DecalLayers },
  842. };
  843. public static KeywordCollection DBufferProjector = new KeywordCollection
  844. {
  845. { CoreKeywordDescriptors.DBuffer },
  846. { Descriptors.DecalLayers },
  847. };
  848. public static KeywordCollection ForwardEmissiveProjector = new KeywordCollection
  849. {
  850. { Descriptors.DecalLayers },
  851. };
  852. public static readonly KeywordCollection ScreenSpaceMeshGl = new KeywordCollection
  853. {
  854. { CoreKeywordDescriptors.StaticLightmap },
  855. { CoreKeywordDescriptors.DynamicLightmap },
  856. { CoreKeywordDescriptors.DirectionalLightmapCombined },
  857. { CoreKeywordDescriptors.UseLegacyLightmaps },
  858. { CoreKeywordDescriptors.MainLightShadows },
  859. { CoreKeywordDescriptors.AdditionalLights },
  860. { CoreKeywordDescriptors.AdditionalLightShadows },
  861. { CoreKeywordDescriptors.ShadowsSoft },
  862. { CoreKeywordDescriptors.LightmapShadowMixing },
  863. { CoreKeywordDescriptors.ShadowsShadowmask },
  864. { CoreKeywordDescriptors.ForwardPlus },
  865. { Descriptors.DecalsNormalBlend },
  866. { CoreKeywordDescriptors.LODFadeCrossFade, new FieldCondition(Fields.LodCrossFade, true) },
  867. { CoreKeywordDescriptors.DebugDisplay },
  868. };
  869. public static readonly KeywordCollection ScreenSpaceMesh = new KeywordCollection
  870. {
  871. { ScreenSpaceMeshGl },
  872. { Descriptors.DecalLayers },
  873. };
  874. public static readonly KeywordCollection ScreenSpaceProjector = new KeywordCollection
  875. {
  876. { CoreKeywordDescriptors.MainLightShadows },
  877. { CoreKeywordDescriptors.AdditionalLights },
  878. { CoreKeywordDescriptors.AdditionalLightShadows },
  879. { CoreKeywordDescriptors.ShadowsSoft },
  880. { CoreKeywordDescriptors.ForwardPlus },
  881. { CoreKeywordDescriptors.LightCookies },
  882. { CoreKeywordDescriptors.DebugDisplay },
  883. { Descriptors.DecalsNormalBlend },
  884. { Descriptors.DecalLayers },
  885. };
  886. public static readonly KeywordCollection GBufferMesh = new KeywordCollection
  887. {
  888. { CoreKeywordDescriptors.StaticLightmap },
  889. { CoreKeywordDescriptors.DynamicLightmap },
  890. { CoreKeywordDescriptors.DirectionalLightmapCombined },
  891. { CoreKeywordDescriptors.UseLegacyLightmaps },
  892. { CoreKeywordDescriptors.MainLightShadows },
  893. { CoreKeywordDescriptors.ShadowsSoft },
  894. { CoreKeywordDescriptors.LightmapShadowMixing },
  895. { CoreKeywordDescriptors.MixedLightingSubtractive },
  896. { Descriptors.DecalsNormalBlend },
  897. { Descriptors.DecalLayers },
  898. { CoreKeywordDescriptors.GBufferNormalsOct },
  899. { CoreKeywordDescriptors.RenderPassEnabled },
  900. { CoreKeywordDescriptors.LODFadeCrossFade, new FieldCondition(Fields.LodCrossFade, true) },
  901. };
  902. public static readonly KeywordCollection GBufferProjector = new KeywordCollection
  903. {
  904. { CoreKeywordDescriptors.MainLightShadows },
  905. { CoreKeywordDescriptors.ShadowsSoft },
  906. { Descriptors.DecalsNormalBlend },
  907. { Descriptors.DecalLayers },
  908. { CoreKeywordDescriptors.GBufferNormalsOct },
  909. { CoreKeywordDescriptors.RenderPassEnabled },
  910. };
  911. }
  912. #endregion
  913. #region Includes
  914. static class DecalIncludes
  915. {
  916. const string kDecalInput = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DecalInput.hlsl";
  917. const string kShaderVariablesDecal = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderVariablesDecal.hlsl";
  918. const string kPassDecal = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPassDecal.hlsl";
  919. const string kShaderPass = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl";
  920. const string kVaryings = "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl";
  921. const string kDBuffer = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl";
  922. const string kGBuffer = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl";
  923. const string kLODCrossFade = "Packages/com.unity.render-pipelines.universal/ShaderLibrary/LODCrossFade.hlsl";
  924. public static IncludeCollection DecalPregraph = new IncludeCollection
  925. {
  926. { kShaderPass, IncludeLocation.Pregraph },
  927. { kDecalInput, IncludeLocation.Pregraph },
  928. { kShaderVariablesDecal, IncludeLocation.Pregraph },
  929. };
  930. public static IncludeCollection DecalPostgraph = new IncludeCollection
  931. {
  932. { kVaryings, IncludeLocation.Postgraph },
  933. { kPassDecal, IncludeLocation.Postgraph },
  934. };
  935. public static IncludeCollection DBuffer = new IncludeCollection
  936. {
  937. // Pre-graph
  938. { CoreIncludes.DOTSPregraph },
  939. { CoreIncludes.CorePregraph },
  940. { CoreIncludes.ShaderGraphPregraph },
  941. { CoreIncludes.ProbeVolumePregraph },
  942. { DecalPregraph },
  943. { kDBuffer, IncludeLocation.Pregraph },
  944. { kLODCrossFade, IncludeLocation.Pregraph, new FieldCondition(Fields.LodCrossFade, true) },
  945. // Post-graph
  946. { DecalPostgraph },
  947. };
  948. public static IncludeCollection ScreenSpace = new IncludeCollection
  949. {
  950. // Pre-graph
  951. { CoreIncludes.DOTSPregraph },
  952. { CoreIncludes.CorePregraph },
  953. { CoreIncludes.ShaderGraphPregraph },
  954. { CoreIncludes.ProbeVolumePregraph },
  955. { DecalPregraph },
  956. { kLODCrossFade, IncludeLocation.Pregraph, new FieldCondition(Fields.LodCrossFade, true) },
  957. // Post-graph
  958. { DecalPostgraph },
  959. };
  960. public static IncludeCollection GBuffer = new IncludeCollection
  961. {
  962. // Pre-graph
  963. { CoreIncludes.DOTSPregraph },
  964. { CoreIncludes.CorePregraph },
  965. { CoreIncludes.ShaderGraphPregraph },
  966. { CoreIncludes.ProbeVolumePregraph },
  967. { kGBuffer, IncludeLocation.Pregraph },
  968. { DecalPregraph },
  969. { kLODCrossFade, IncludeLocation.Pregraph, new FieldCondition(Fields.LodCrossFade, true) },
  970. // Post-graph
  971. { DecalPostgraph },
  972. };
  973. public static IncludeCollection ScenePicking = new IncludeCollection
  974. {
  975. // Pre-graph
  976. { CoreIncludes.CorePregraph },
  977. { CoreIncludes.ShaderGraphPregraph },
  978. { DecalPregraph },
  979. // Post-graph
  980. { DecalPostgraph },
  981. };
  982. }
  983. #endregion
  984. }
  985. }