설명 없음
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.

CanvasSubTarget.cs 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. using UnityEditor.ShaderGraph;
  2. using UnityEngine;
  3. using System;
  4. using UnityEngine.UIElements;
  5. using UnityEditor.Rendering.BuiltIn.ShaderGraph;
  6. namespace UnityEditor.Rendering.Canvas.ShaderGraph
  7. {
  8. #region CanvasUniforms
  9. internal static class CanvasUniforms
  10. {
  11. // Uniforms
  12. public static readonly string Lighting = "Off";
  13. public static string ColorMask = "ColorMask [_ColorMask]";
  14. public static string ZTest = "[unity_GUIZTestMode]";
  15. //stencil Props
  16. public static string Ref = "[_Stencil]";
  17. public static string Comp = "[_StencilComp]";
  18. public static string Pass = "[_StencilOp]";
  19. public static string ReadMask = "[_StencilReadMask]";
  20. public static string WriteMask = "[_StencilWriteMask]";
  21. }
  22. #endregion
  23. internal abstract class CanvasSubTarget<T> : SubTarget<T>, IRequiresData<CanvasData>, IHasMetadata where T : Target
  24. {
  25. const string kAssetGuid = "3ab5e3f315cd4041b2aa8600df09dd3e"; // CanvasSubTarget.cs
  26. #region Includes
  27. static readonly string[] kSharedTemplateDirectories = GetCanvasTemplateDirectories();
  28. private static string[] GetCanvasTemplateDirectories()
  29. {
  30. var shared = GenerationUtils.GetDefaultSharedTemplateDirectories();
  31. var canvasTemplateDirectories = new string[shared.Length + 1];
  32. canvasTemplateDirectories[shared.Length] = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Canvas/Templates";
  33. for(int i = 0; i < shared.Length; ++i)
  34. {
  35. canvasTemplateDirectories[i] = shared[i];
  36. }
  37. return canvasTemplateDirectories;
  38. }
  39. //HLSL Includes
  40. protected static readonly string kTemplatePath = "Packages/com.unity.shadergraph/Editor/Generation/Targets/Canvas/Templates/PassUI.template";
  41. protected static readonly string kCommon = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl";
  42. protected static readonly string kColor = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl";
  43. protected static readonly string kTexture = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl";
  44. protected static readonly string kInstancing = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl";
  45. protected static readonly string kPacking = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl";
  46. protected static readonly string kSpaceTransforms = "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl";
  47. protected static readonly string kFunctions = "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl";
  48. protected static readonly string kTextureStack = "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl";
  49. #endregion
  50. CanvasData m_CanvasData;
  51. CanvasData IRequiresData<CanvasData>.data
  52. {
  53. get => m_CanvasData;
  54. set => m_CanvasData = value;
  55. }
  56. public CanvasData canvasData
  57. {
  58. get => m_CanvasData;
  59. set => m_CanvasData = value;
  60. }
  61. protected bool TargetsVFX() => false;
  62. protected virtual IncludeCollection pregraphIncludes => new IncludeCollection();
  63. protected virtual IncludeCollection postgraphIncludes => new IncludeCollection();
  64. protected virtual KeywordCollection GetAdditionalKeywords() => new KeywordCollection();
  65. protected abstract string pipelineTag { get; }
  66. protected virtual Type GetDefaultShaderGUI() => typeof(CanvasShaderGUI);
  67. public virtual string identifier => GetType().Name;
  68. public virtual ScriptableObject GetMetadataObject(GraphDataReadOnly graph)
  69. {
  70. var canvasMetadata = ScriptableObject.CreateInstance<CanvasMetaData>();
  71. return canvasMetadata;
  72. }
  73. public override bool IsActive() => true;
  74. public override void Setup(ref TargetSetupContext context)
  75. {
  76. context.AddAssetDependency(new GUID(kAssetGuid), AssetCollection.Flags.SourceDependency);
  77. context.AddSubShader(GenerateDefaultSubshader());
  78. }
  79. public override void GetActiveBlocks(ref TargetActiveBlockContext context)
  80. {
  81. //Core Fragment Blocks
  82. context.AddBlock(BlockFields.SurfaceDescription.BaseColor);
  83. context.AddBlock(BlockFields.SurfaceDescription.Emission);
  84. context.AddBlock(BlockFields.SurfaceDescription.Alpha);
  85. }
  86. public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode)
  87. {
  88. base.CollectShaderProperties(collector, generationMode);
  89. CollectRenderStateShaderProperties(collector, generationMode);
  90. }
  91. public void CollectRenderStateShaderProperties(PropertyCollector collector, GenerationMode generationMode)
  92. {
  93. base.CollectShaderProperties(collector, generationMode);
  94. collector.AddShaderProperty(CanvasProperties.MainTex);
  95. collector.AddShaderProperty(CanvasProperties.StencilComp);
  96. collector.AddShaderProperty(CanvasProperties.Stencil);
  97. collector.AddShaderProperty(CanvasProperties.StencilOp);
  98. collector.AddShaderProperty(CanvasProperties.StencilWriteMask);
  99. collector.AddShaderProperty(CanvasProperties.StencilReadMask);
  100. collector.AddShaderProperty(CanvasProperties.ColorMask);
  101. collector.AddShaderProperty(CanvasProperties.ClipRect);
  102. collector.AddShaderProperty(CanvasProperties.UIMaskSoftnessX);
  103. collector.AddShaderProperty(CanvasProperties.UIMaskSoftnessY);
  104. }
  105. public override void GetFields(ref TargetFieldContext context)
  106. {
  107. context.AddField(UnityEditor.ShaderGraph.Fields.GraphPixel);
  108. }
  109. protected virtual DefineCollection GetAdditionalDefines()
  110. {
  111. var result = new DefineCollection();
  112. if (canvasData.disableTint)
  113. result.Add(CanvasKeywords.DisableTint, 1);
  114. return result;
  115. }
  116. public override void GetPropertiesGUI(ref TargetPropertyGUIContext context, Action onChange, Action<string> registerUndo)
  117. {
  118. context.AddProperty("Alpha Clipping", new Toggle() { value = canvasData.alphaClip }, (evt) =>
  119. {
  120. if (Equals(canvasData.alphaClip, evt.newValue))
  121. return;
  122. registerUndo("Alpha Clip");
  123. canvasData.alphaClip = evt.newValue;
  124. onChange();
  125. });
  126. context.AddProperty("Disable Color Tint", new Toggle() { value = canvasData.disableTint }, (evt) =>
  127. {
  128. if (Equals(canvasData.disableTint, evt.newValue))
  129. return;
  130. registerUndo("Disable Tint");
  131. canvasData.disableTint = evt.newValue;
  132. onChange();
  133. });
  134. }
  135. public virtual SubShaderDescriptor GenerateDefaultSubshader(bool isSRP = true )
  136. {
  137. var result = new SubShaderDescriptor()
  138. {
  139. pipelineTag = pipelineTag,
  140. renderQueue = "Transparent",
  141. IgnoreProjector = "True",
  142. renderType = "Transparent",
  143. PreviewType = "Plane",
  144. CanUseSpriteAtlas = "True",
  145. generatesPreview = true,
  146. passes = new PassCollection(),
  147. };
  148. result.passes.Add(GenerateUIPassDescriptor(isSRP));
  149. return result;
  150. }
  151. public IncludeCollection AdditionalIncludesOnly()
  152. {
  153. return new IncludeCollection
  154. {
  155. { pregraphIncludes },
  156. { postgraphIncludes },
  157. };
  158. }
  159. public IncludeCollection SRPCoreIncludes()
  160. {
  161. return new IncludeCollection
  162. {
  163. // Pre-graph
  164. SRPPreGraphIncludes(),
  165. // Post-graph
  166. SRPPostGraphIncludes(),
  167. };
  168. }
  169. public virtual IncludeCollection SRPPreGraphIncludes()
  170. {
  171. return new IncludeCollection
  172. {
  173. {kCommon, IncludeLocation.Pregraph},
  174. {kColor, IncludeLocation.Pregraph},
  175. {kTexture, IncludeLocation.Pregraph},
  176. {kTextureStack, IncludeLocation.Pregraph},
  177. { pregraphIncludes },
  178. {kSpaceTransforms, IncludeLocation.Pregraph},
  179. {kFunctions, IncludeLocation.Pregraph},
  180. };
  181. }
  182. public virtual IncludeCollection SRPPostGraphIncludes()
  183. {
  184. return new IncludeCollection
  185. {
  186. { postgraphIncludes },
  187. };
  188. }
  189. protected virtual DefineCollection GetPassDefines()
  190. => new DefineCollection();
  191. protected virtual KeywordCollection GetPassKeywords()
  192. => new KeywordCollection();
  193. public virtual PassDescriptor GenerateUIPassDescriptor(bool isSRP)
  194. {
  195. var DefaultCanvasPass = new PassDescriptor()
  196. {
  197. // Definition
  198. displayName = "Default",
  199. referenceName = "SHADERPASS_CUSTOM_UI",
  200. useInPreview = true,
  201. // Templates
  202. passTemplatePath = kTemplatePath,
  203. sharedTemplateDirectories = kSharedTemplateDirectories,
  204. // Port Mask
  205. validVertexBlocks = CanvasBlockMasks.Vertex,
  206. validPixelBlocks = CanvasBlockMasks.Fragment,
  207. // Collections
  208. // Fields
  209. structs = CanvasStructCollections.Default,
  210. requiredFields = CanvasRequiredFields.Default,
  211. fieldDependencies = FieldDependencies.Default,
  212. //Conditional State
  213. renderStates = CanvasRenderStates.GenerateRenderStateDeclaration(),
  214. pragmas = CanvasPragmas.Default,
  215. includes = isSRP ? SRPCoreIncludes() : AdditionalIncludesOnly(),
  216. //definitions
  217. defines = GetPassDefines(),
  218. keywords = CanvasKeywords.GenerateCoreKeywords(),
  219. };
  220. DefaultCanvasPass.defines.Add(GetAdditionalDefines());
  221. DefaultCanvasPass.keywords.Add(GetAdditionalKeywords());
  222. return DefaultCanvasPass;
  223. }
  224. // We don't need the save context / update materials for now
  225. public override object saveContext => null;
  226. public CanvasSubTarget()
  227. {
  228. displayName = "Canvas";
  229. }
  230. public override bool IsNodeAllowedBySubTarget(Type nodeType)
  231. {
  232. var interfaces = nodeType.GetInterfaces();
  233. int numInterfaces = interfaces.Length;
  234. // Subgraph nodes inherits all the interfaces including vertex ones.
  235. if (nodeType == typeof(BitangentVectorNode))
  236. return false;
  237. if (nodeType == typeof(TangentVectorNode))
  238. return false;
  239. if (nodeType == typeof(SubGraphNode))
  240. return true;
  241. if (nodeType == typeof(BakedGINode))
  242. return false;
  243. if (nodeType == typeof(ParallaxMappingNode))
  244. return false;
  245. if (nodeType == typeof(ParallaxOcclusionMappingNode))
  246. return false;
  247. if (nodeType == typeof(TriplanarNode))
  248. return false;
  249. if (nodeType == typeof(IsFrontFaceNode))
  250. return false;
  251. for (int i = 0; i < numInterfaces; i++)
  252. {
  253. if (interfaces[i] == typeof(IMayRequireVertexSkinning)) return false;
  254. }
  255. return true;
  256. }
  257. #region KeywordDescriptors
  258. internal static class CanvasKeywords
  259. {
  260. public static KeywordCollection GenerateCoreKeywords()
  261. {
  262. return new KeywordCollection()
  263. {
  264. UIAlphaClipKeyword,
  265. UIClipRectKeyword,
  266. };
  267. }
  268. static KeywordDescriptor UIClipRectKeyword = new KeywordDescriptor()
  269. {
  270. displayName = "UIClipRect",
  271. referenceName = "UNITY_UI_CLIP_RECT",
  272. type = KeywordType.Boolean,
  273. definition = KeywordDefinition.MultiCompile,
  274. scope = KeywordScope.Local,
  275. };
  276. static KeywordDescriptor UIAlphaClipKeyword = new KeywordDescriptor()
  277. {
  278. displayName = "UIAlphaClip",
  279. referenceName = "UNITY_UI_ALPHACLIP",
  280. type = KeywordType.Boolean,
  281. definition = KeywordDefinition.MultiCompile,
  282. scope = KeywordScope.Local,
  283. };
  284. public static readonly KeywordDescriptor DisableTint = new KeywordDescriptor()
  285. {
  286. displayName = "Disable Tint",
  287. referenceName = "_DISABLE_COLOR_TINT",
  288. type = KeywordType.Boolean,
  289. definition = KeywordDefinition.ShaderFeature,
  290. scope = KeywordScope.Local,
  291. stages = KeywordShaderStage.All,
  292. };
  293. }
  294. #endregion
  295. }
  296. #region PortMasks
  297. class CanvasBlockMasks
  298. {
  299. // Port Mask
  300. public static BlockFieldDescriptor[] Vertex = null;
  301. public static BlockFieldDescriptor[] Fragment = new BlockFieldDescriptor[]
  302. {
  303. BlockFields.SurfaceDescription.BaseColor,
  304. BlockFields.SurfaceDescription.Alpha,
  305. BlockFields.SurfaceDescription.Emission,
  306. BlockFields.SurfaceDescription.AlphaClipThreshold
  307. };
  308. }
  309. #endregion
  310. #region StructCollections
  311. static class CanvasStructCollections
  312. {
  313. public static StructCollection Default = new StructCollection()
  314. {
  315. CanvasStructs.Attributes,
  316. Structs.SurfaceDescriptionInputs,
  317. CanvasStructs.Varyings,
  318. Structs.VertexDescriptionInputs,
  319. };
  320. }
  321. #endregion
  322. #region RequiredFields
  323. static class CanvasRequiredFields
  324. {
  325. public static FieldCollection Default = new FieldCollection()
  326. {
  327. StructFields.Varyings.positionCS,
  328. StructFields.Varyings.normalWS,
  329. StructFields.Varyings.positionWS,
  330. StructFields.Varyings.color,
  331. StructFields.Varyings.texCoord0,
  332. StructFields.Varyings.texCoord1,
  333. StructFields.Attributes.color,
  334. StructFields.Attributes.uv0, // Always need texCoord0, for UI image
  335. StructFields.Attributes.uv1, // Always need texCoord1 for UI Clip Mask
  336. StructFields.Attributes.positionOS,
  337. StructFields.Attributes.normalOS,
  338. StructFields.Attributes.instanceID,
  339. StructFields.Attributes.vertexID,
  340. };
  341. }
  342. #endregion
  343. #region RenderStates
  344. static class CanvasRenderStates
  345. {
  346. public static RenderStateCollection GenerateRenderStateDeclaration()
  347. {
  348. return new RenderStateCollection
  349. {
  350. {RenderState.Cull(Cull.Off)},
  351. {RenderState.ZWrite(ZWrite.Off)},
  352. {RenderState.ZTest(CanvasUniforms.ZTest)},
  353. {RenderState.Blend(Blend.One, Blend.OneMinusSrcAlpha)},
  354. {RenderState.ColorMask(CanvasUniforms.ColorMask)},
  355. {RenderState.Stencil(new StencilDescriptor()
  356. {
  357. Ref = CanvasUniforms.Ref,
  358. Comp = CanvasUniforms.Comp,
  359. Pass = CanvasUniforms.Pass,
  360. ReadMask = CanvasUniforms.ReadMask,
  361. WriteMask = CanvasUniforms.WriteMask,
  362. })
  363. }
  364. };
  365. }
  366. }
  367. #endregion
  368. #region Pragmas
  369. static class CanvasPragmas
  370. {
  371. public static PragmaCollection Default = new PragmaCollection
  372. {
  373. {Pragma.Target(ShaderModel.Target20)},
  374. {Pragma.Vertex("vert")},
  375. {Pragma.Fragment("frag")},
  376. };
  377. public static PragmaCollection DefaulDebugt = new PragmaCollection
  378. {
  379. {Pragma.Target(ShaderModel.Target20)},
  380. {Pragma.Vertex("vert")},
  381. {Pragma.Fragment("frag")},
  382. {Pragma.DebugSymbols},
  383. };
  384. }
  385. #endregion
  386. }