No Description
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.

UniversalSpriteLitSubTarget.cs 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEditor.ShaderGraph;
  4. using UnityEditor.ShaderGraph.Legacy;
  5. using Unity.Rendering.Universal;
  6. using UnityEngine;
  7. namespace UnityEditor.Rendering.Universal.ShaderGraph
  8. {
  9. sealed class UniversalSpriteLitSubTarget : UniversalSubTarget, ILegacyTarget
  10. {
  11. static readonly GUID kSourceCodeGuid = new GUID("ea1514729d7120344b27dcd67fbf34de"); // UniversalSpriteLitSubTarget.cs
  12. public UniversalSpriteLitSubTarget()
  13. {
  14. displayName = "Sprite Lit";
  15. }
  16. public override bool IsActive() => true;
  17. protected override ShaderUtils.ShaderID shaderID => ShaderUtils.ShaderID.SG_SpriteLit;
  18. public override void Setup(ref TargetSetupContext context)
  19. {
  20. base.Setup(ref context);
  21. context.AddAssetDependency(kSourceCodeGuid, AssetCollection.Flags.SourceDependency);
  22. #if HAS_VFX_GRAPH
  23. var universalRPType = typeof(UnityEngine.Rendering.Universal.UniversalRenderPipelineAsset);
  24. if (TargetsVFX() && !context.HasCustomEditorForRenderPipeline(universalRPType))
  25. {
  26. context.AddCustomEditorForRenderPipeline(typeof(VFXGenericShaderGraphMaterialGUI).FullName, universalRPType);
  27. }
  28. #endif
  29. context.AddSubShader(PostProcessSubShader(SubShaders.SpriteLit(target)));
  30. }
  31. public override void GetFields(ref TargetFieldContext context)
  32. {
  33. base.GetFields(ref context);
  34. SpriteSubTargetUtility.AddDefaultFields(ref context, target);
  35. }
  36. public override void GetActiveBlocks(ref TargetActiveBlockContext context)
  37. {
  38. SpriteSubTargetUtility.GetDefaultActiveBlocks(ref context, target);
  39. context.AddBlock(UniversalBlockFields.SurfaceDescription.SpriteMask);
  40. context.AddBlock(BlockFields.SurfaceDescription.NormalTS);
  41. }
  42. public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action<String> registerUndo)
  43. {
  44. SpriteSubTargetUtility.AddDefaultPropertiesGUI(ref context, onChange, registerUndo, target);
  45. }
  46. public bool TryUpgradeFromMasterNode(IMasterNode1 masterNode, out Dictionary<BlockFieldDescriptor, int> blockMap)
  47. {
  48. blockMap = null;
  49. if (!(masterNode is SpriteLitMasterNode1 spriteLitMasterNode))
  50. return false;
  51. // Set blockmap
  52. blockMap = new Dictionary<BlockFieldDescriptor, int>()
  53. {
  54. { BlockFields.VertexDescription.Position, 9 },
  55. { BlockFields.VertexDescription.Normal, 10 },
  56. { BlockFields.VertexDescription.Tangent, 11 },
  57. { BlockFields.SurfaceDescriptionLegacy.SpriteColor, 0 },
  58. { UniversalBlockFields.SurfaceDescription.SpriteMask, 1 },
  59. { BlockFields.SurfaceDescription.NormalTS, 2 },
  60. { BlockFields.SurfaceDescription.AlphaClipThreshold, 8 },
  61. };
  62. return true;
  63. }
  64. #region SubShader
  65. static class SubShaders
  66. {
  67. public static SubShaderDescriptor SpriteLit(UniversalTarget target)
  68. {
  69. SubShaderDescriptor result = new SubShaderDescriptor()
  70. {
  71. pipelineTag = UniversalTarget.kPipelineTag,
  72. customTags = UniversalTarget.kLitMaterialTypeTag,
  73. renderType = $"{RenderType.Transparent}",
  74. renderQueue = $"{UnityEditor.ShaderGraph.RenderQueue.Transparent}",
  75. generatesPreview = true,
  76. passes = new PassCollection
  77. {
  78. { SpriteLitPasses.Lit(target) },
  79. { SpriteLitPasses.Normal(target) },
  80. // Currently neither of these passes (selection/picking) can be last for the game view for
  81. // UI shaders to render correctly. Verify [1352225] before changing this order.
  82. { CorePasses._2DSceneSelection(target) },
  83. { CorePasses._2DScenePicking(target) },
  84. { SpriteLitPasses.Forward(target) },
  85. },
  86. };
  87. return result;
  88. }
  89. }
  90. #endregion
  91. #region Passes
  92. static class SpriteLitPasses
  93. {
  94. public static PassDescriptor Lit(UniversalTarget target)
  95. {
  96. var result = new PassDescriptor()
  97. {
  98. // Definition
  99. displayName = "Sprite Lit",
  100. referenceName = "SHADERPASS_SPRITELIT",
  101. lightMode = "Universal2D",
  102. useInPreview = true,
  103. // Template
  104. passTemplatePath = UniversalTarget.kUberTemplatePath,
  105. sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,
  106. // Port Mask
  107. validVertexBlocks = CoreBlockMasks.Vertex,
  108. validPixelBlocks = SpriteLitBlockMasks.FragmentLit,
  109. // Fields
  110. structs = CoreStructCollections.Default,
  111. requiredFields = SpriteLitRequiredFields.Lit,
  112. fieldDependencies = CoreFieldDependencies.Default,
  113. // Conditional State
  114. renderStates = CoreRenderStates.Default,
  115. pragmas = CorePragmas._2DDefault,
  116. defines = new DefineCollection(),
  117. keywords = SpriteLitKeywords.Lit,
  118. includes = SpriteLitIncludes.Lit,
  119. // Custom Interpolator Support
  120. customInterpolators = CoreCustomInterpDescriptors.Common
  121. };
  122. if (target.disableTint)
  123. result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);
  124. SpriteSubTargetUtility.AddAlphaClipControlToPass(ref result, target);
  125. return result;
  126. }
  127. public static PassDescriptor Normal(UniversalTarget target)
  128. {
  129. var result = new PassDescriptor()
  130. {
  131. // Definition
  132. displayName = "Sprite Normal",
  133. referenceName = "SHADERPASS_SPRITENORMAL",
  134. lightMode = "NormalsRendering",
  135. useInPreview = true,
  136. // Template
  137. passTemplatePath = UniversalTarget.kUberTemplatePath,
  138. sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,
  139. // Port Mask
  140. validVertexBlocks = CoreBlockMasks.Vertex,
  141. validPixelBlocks = SpriteLitBlockMasks.FragmentForwardNormal,
  142. // Fields
  143. structs = CoreStructCollections.Default,
  144. requiredFields = SpriteLitRequiredFields.Normal,
  145. fieldDependencies = CoreFieldDependencies.Default,
  146. // Conditional State
  147. renderStates = CoreRenderStates.Default,
  148. pragmas = CorePragmas._2DDefault,
  149. defines = new DefineCollection(),
  150. includes = SpriteLitIncludes.Normal,
  151. // Custom Interpolator Support
  152. customInterpolators = CoreCustomInterpDescriptors.Common
  153. };
  154. if (target.disableTint)
  155. result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);
  156. SpriteSubTargetUtility.AddAlphaClipControlToPass(ref result, target);
  157. return result;
  158. }
  159. public static PassDescriptor Forward(UniversalTarget target)
  160. {
  161. var result = new PassDescriptor
  162. {
  163. // Definition
  164. displayName = "Sprite Forward",
  165. referenceName = "SHADERPASS_SPRITEFORWARD",
  166. lightMode = "UniversalForward",
  167. useInPreview = true,
  168. // Template
  169. passTemplatePath = UniversalTarget.kUberTemplatePath,
  170. sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,
  171. // Port Mask
  172. validVertexBlocks = CoreBlockMasks.Vertex,
  173. validPixelBlocks = SpriteLitBlockMasks.FragmentForwardNormal,
  174. // Fields
  175. structs = CoreStructCollections.Default,
  176. requiredFields = SpriteLitRequiredFields.Forward,
  177. keywords = SpriteLitKeywords.Forward,
  178. fieldDependencies = CoreFieldDependencies.Default,
  179. // Conditional State
  180. renderStates = CoreRenderStates.Default,
  181. pragmas = CorePragmas._2DDefault,
  182. defines = new DefineCollection(),
  183. includes = SpriteLitIncludes.Forward,
  184. // Custom Interpolator Support
  185. customInterpolators = CoreCustomInterpDescriptors.Common
  186. };
  187. if (target.disableTint)
  188. result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);
  189. return result;
  190. }
  191. }
  192. #endregion
  193. #region PortMasks
  194. static class SpriteLitBlockMasks
  195. {
  196. public static BlockFieldDescriptor[] FragmentLit = new BlockFieldDescriptor[]
  197. {
  198. BlockFields.SurfaceDescription.BaseColor,
  199. BlockFields.SurfaceDescriptionLegacy.SpriteColor,
  200. BlockFields.SurfaceDescription.Alpha,
  201. UniversalBlockFields.SurfaceDescription.SpriteMask,
  202. BlockFields.SurfaceDescription.AlphaClipThreshold,
  203. };
  204. public static BlockFieldDescriptor[] FragmentForwardNormal = new BlockFieldDescriptor[]
  205. {
  206. BlockFields.SurfaceDescription.BaseColor,
  207. BlockFields.SurfaceDescriptionLegacy.SpriteColor,
  208. BlockFields.SurfaceDescription.Alpha,
  209. BlockFields.SurfaceDescription.NormalTS,
  210. BlockFields.SurfaceDescription.AlphaClipThreshold,
  211. };
  212. }
  213. #endregion
  214. #region RequiredFields
  215. static class SpriteLitRequiredFields
  216. {
  217. public static FieldCollection Lit = new FieldCollection()
  218. {
  219. StructFields.Varyings.color,
  220. StructFields.Varyings.positionWS,
  221. StructFields.Varyings.texCoord0,
  222. StructFields.Varyings.screenPosition,
  223. };
  224. public static FieldCollection Normal = new FieldCollection()
  225. {
  226. StructFields.Varyings.normalWS,
  227. StructFields.Varyings.tangentWS,
  228. };
  229. public static FieldCollection Forward = new FieldCollection()
  230. {
  231. StructFields.Varyings.color,
  232. StructFields.Varyings.positionWS,
  233. StructFields.Varyings.texCoord0,
  234. };
  235. }
  236. #endregion
  237. #region Keywords
  238. static class SpriteLitKeywords
  239. {
  240. public static KeywordCollection Lit = new KeywordCollection
  241. {
  242. { CoreKeywordDescriptors.ShapeLightType0 },
  243. { CoreKeywordDescriptors.ShapeLightType1 },
  244. { CoreKeywordDescriptors.ShapeLightType2 },
  245. { CoreKeywordDescriptors.ShapeLightType3 },
  246. { CoreKeywordDescriptors.DebugDisplay },
  247. };
  248. public static KeywordCollection Forward = new KeywordCollection
  249. {
  250. { CoreKeywordDescriptors.DebugDisplay },
  251. };
  252. }
  253. #endregion
  254. #region Includes
  255. static class SpriteLitIncludes
  256. {
  257. const string k2DLightingUtil = "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/LightingUtility.hlsl";
  258. const string k2DNormal = "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/NormalsRenderingShared.hlsl";
  259. const string kSpriteLitPass = "Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteLitPass.hlsl";
  260. const string kSpriteNormalPass = "Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteNormalPass.hlsl";
  261. const string kSpriteForwardPass = "Packages/com.unity.render-pipelines.universal/Editor/2D/ShaderGraph/Includes/SpriteForwardPass.hlsl";
  262. public static IncludeCollection Lit = new IncludeCollection
  263. {
  264. // Pre-graph
  265. { CoreIncludes.CorePregraph },
  266. { CoreIncludes.ShaderGraphPregraph },
  267. { k2DLightingUtil, IncludeLocation.Pregraph },
  268. // Post-graph
  269. { CoreIncludes.CorePostgraph },
  270. { kSpriteLitPass, IncludeLocation.Postgraph },
  271. };
  272. public static IncludeCollection Normal = new IncludeCollection
  273. {
  274. // Pre-graph
  275. { CoreIncludes.CorePregraph },
  276. { CoreIncludes.ShaderGraphPregraph },
  277. { k2DNormal, IncludeLocation.Pregraph },
  278. // Post-graph
  279. { CoreIncludes.CorePostgraph },
  280. { kSpriteNormalPass, IncludeLocation.Postgraph },
  281. };
  282. public static IncludeCollection Forward = new IncludeCollection
  283. {
  284. // Pre-graph
  285. { CoreIncludes.CorePregraph },
  286. { CoreIncludes.ShaderGraphPregraph },
  287. // Post-graph
  288. { CoreIncludes.CorePostgraph },
  289. { kSpriteForwardPass, IncludeLocation.Postgraph },
  290. };
  291. }
  292. #endregion
  293. }
  294. }