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.

ShaderGraphRequirements.cs 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. namespace UnityEditor.ShaderGraph.Internal
  6. {
  7. [Serializable]
  8. public struct ShaderGraphRequirements
  9. {
  10. [SerializeField] List<NeededTransform> m_RequiresTransforms;
  11. [SerializeField] NeededCoordinateSpace m_RequiresNormal;
  12. [SerializeField] NeededCoordinateSpace m_RequiresBitangent;
  13. [SerializeField] NeededCoordinateSpace m_RequiresTangent;
  14. [SerializeField] NeededCoordinateSpace m_RequiresViewDir;
  15. [SerializeField] NeededCoordinateSpace m_RequiresPosition;
  16. [SerializeField] NeededCoordinateSpace m_RequiresPositionPredisplacement;
  17. [SerializeField] bool m_RequiresScreenPosition;
  18. [SerializeField] bool m_RequiresNDCPosition;
  19. [SerializeField] bool m_RequiresPixelPosition;
  20. [SerializeField] bool m_RequiresVertexColor;
  21. [SerializeField] bool m_RequiresFaceSign;
  22. [SerializeField] List<UVChannel> m_RequiresMeshUVs;
  23. [SerializeField] bool m_RequiresDepthTexture;
  24. [SerializeField] bool m_RequiresCameraOpaqueTexture;
  25. [SerializeField] bool m_RequiresTime;
  26. [SerializeField] bool m_RequiresVertexSkinning;
  27. [SerializeField] bool m_RequiresVertexID;
  28. [SerializeField] bool m_RequiresInstanceID;
  29. [SerializeField] List<UVChannel> m_RequiresMeshUVDerivatives;
  30. internal static ShaderGraphRequirements none
  31. {
  32. get
  33. {
  34. return new ShaderGraphRequirements
  35. {
  36. m_RequiresTransforms = new List<NeededTransform>(),
  37. m_RequiresMeshUVs = new List<UVChannel>(),
  38. m_RequiresMeshUVDerivatives = new List<UVChannel>()
  39. };
  40. }
  41. }
  42. public List<NeededTransform> requiresTransforms
  43. {
  44. get { return m_RequiresTransforms; }
  45. internal set { m_RequiresTransforms = value; }
  46. }
  47. public NeededCoordinateSpace requiresNormal
  48. {
  49. get { return m_RequiresNormal; }
  50. internal set { m_RequiresNormal = value; }
  51. }
  52. public NeededCoordinateSpace requiresBitangent
  53. {
  54. get { return m_RequiresBitangent; }
  55. internal set { m_RequiresBitangent = value; }
  56. }
  57. public NeededCoordinateSpace requiresTangent
  58. {
  59. get { return m_RequiresTangent; }
  60. internal set { m_RequiresTangent = value; }
  61. }
  62. public NeededCoordinateSpace requiresViewDir
  63. {
  64. get { return m_RequiresViewDir; }
  65. internal set { m_RequiresViewDir = value; }
  66. }
  67. public NeededCoordinateSpace requiresPosition
  68. {
  69. get { return m_RequiresPosition; }
  70. internal set { m_RequiresPosition = value; }
  71. }
  72. public NeededCoordinateSpace requiresPositionPredisplacement
  73. {
  74. get { return m_RequiresPositionPredisplacement; }
  75. internal set { m_RequiresPositionPredisplacement = value; }
  76. }
  77. public bool requiresScreenPosition
  78. {
  79. get { return m_RequiresScreenPosition; }
  80. internal set { m_RequiresScreenPosition = value; }
  81. }
  82. public bool requiresNDCPosition
  83. {
  84. get { return m_RequiresNDCPosition; }
  85. internal set { m_RequiresNDCPosition = value; }
  86. }
  87. public bool requiresPixelPosition
  88. {
  89. get { return m_RequiresPixelPosition; }
  90. internal set { m_RequiresPixelPosition = value; }
  91. }
  92. public bool requiresVertexColor
  93. {
  94. get { return m_RequiresVertexColor; }
  95. internal set { m_RequiresVertexColor = value; }
  96. }
  97. public bool requiresFaceSign
  98. {
  99. get { return m_RequiresFaceSign; }
  100. internal set { m_RequiresFaceSign = value; }
  101. }
  102. public List<UVChannel> requiresMeshUVs
  103. {
  104. get { return m_RequiresMeshUVs; }
  105. internal set { m_RequiresMeshUVs = value; }
  106. }
  107. public List<UVChannel> requiresMeshUVDerivatives
  108. {
  109. get { return m_RequiresMeshUVDerivatives; }
  110. internal set { m_RequiresMeshUVDerivatives = value; }
  111. }
  112. public bool requiresDepthTexture
  113. {
  114. get { return m_RequiresDepthTexture; }
  115. internal set { m_RequiresDepthTexture = value; }
  116. }
  117. public bool requiresCameraOpaqueTexture
  118. {
  119. get { return m_RequiresCameraOpaqueTexture; }
  120. internal set { m_RequiresCameraOpaqueTexture = value; }
  121. }
  122. public bool requiresTime
  123. {
  124. get { return m_RequiresTime; }
  125. internal set { m_RequiresTime = value; }
  126. }
  127. public bool requiresVertexSkinning
  128. {
  129. get { return m_RequiresVertexSkinning; }
  130. internal set { m_RequiresVertexSkinning = value; }
  131. }
  132. public bool requiresVertexID
  133. {
  134. get { return m_RequiresVertexID; }
  135. internal set { m_RequiresVertexID = value; }
  136. }
  137. public bool requiresInstanceID
  138. {
  139. get { return m_RequiresInstanceID; }
  140. internal set { m_RequiresInstanceID = value; }
  141. }
  142. internal bool NeedsTangentSpace()
  143. {
  144. var compoundSpaces = m_RequiresBitangent | m_RequiresNormal | m_RequiresPosition
  145. | m_RequiresTangent | m_RequiresViewDir | m_RequiresPosition
  146. | m_RequiresNormal;
  147. return (compoundSpaces & NeededCoordinateSpace.Tangent) > 0;
  148. }
  149. internal ShaderGraphRequirements Union(ShaderGraphRequirements other)
  150. {
  151. var newReqs = new ShaderGraphRequirements();
  152. newReqs.m_RequiresNormal = other.m_RequiresNormal | m_RequiresNormal;
  153. newReqs.m_RequiresTangent = other.m_RequiresTangent | m_RequiresTangent;
  154. newReqs.m_RequiresBitangent = other.m_RequiresBitangent | m_RequiresBitangent;
  155. newReqs.m_RequiresViewDir = other.m_RequiresViewDir | m_RequiresViewDir;
  156. newReqs.m_RequiresPosition = other.m_RequiresPosition | m_RequiresPosition;
  157. newReqs.m_RequiresPositionPredisplacement = other.m_RequiresPositionPredisplacement | m_RequiresPositionPredisplacement;
  158. newReqs.m_RequiresScreenPosition = other.m_RequiresScreenPosition | m_RequiresScreenPosition;
  159. newReqs.m_RequiresNDCPosition = other.m_RequiresNDCPosition | m_RequiresNDCPosition;
  160. newReqs.m_RequiresPixelPosition = other.m_RequiresPixelPosition | m_RequiresPixelPosition;
  161. newReqs.m_RequiresVertexColor = other.m_RequiresVertexColor | m_RequiresVertexColor;
  162. newReqs.m_RequiresFaceSign = other.m_RequiresFaceSign | m_RequiresFaceSign;
  163. newReqs.m_RequiresDepthTexture = other.m_RequiresDepthTexture | m_RequiresDepthTexture;
  164. newReqs.m_RequiresCameraOpaqueTexture = other.m_RequiresCameraOpaqueTexture | m_RequiresCameraOpaqueTexture;
  165. newReqs.m_RequiresTime = other.m_RequiresTime | m_RequiresTime;
  166. newReqs.m_RequiresVertexSkinning = other.m_RequiresVertexSkinning | m_RequiresVertexSkinning;
  167. newReqs.m_RequiresVertexID = other.m_RequiresVertexID | m_RequiresVertexID;
  168. newReqs.m_RequiresInstanceID = other.m_RequiresInstanceID | m_RequiresInstanceID;
  169. newReqs.m_RequiresMeshUVs = new List<UVChannel>();
  170. if (m_RequiresMeshUVs != null)
  171. newReqs.m_RequiresMeshUVs.AddRange(m_RequiresMeshUVs);
  172. if (other.m_RequiresMeshUVs != null)
  173. newReqs.m_RequiresMeshUVs.AddRange(other.m_RequiresMeshUVs);
  174. newReqs.m_RequiresMeshUVDerivatives = new List<UVChannel>();
  175. if (m_RequiresMeshUVDerivatives != null)
  176. newReqs.m_RequiresMeshUVDerivatives.AddRange(m_RequiresMeshUVDerivatives);
  177. if (other.m_RequiresMeshUVDerivatives != null)
  178. newReqs.m_RequiresMeshUVDerivatives.AddRange(other.m_RequiresMeshUVDerivatives);
  179. return newReqs;
  180. }
  181. internal static ShaderGraphRequirements FromNodes<T>(IEnumerable<T> nodes, ShaderStageCapability stageCapability = ShaderStageCapability.All, bool includeIntermediateSpaces = true, bool[] texCoordNeedsDerivs = null)
  182. where T : AbstractMaterialNode
  183. {
  184. var reqs = new ShaderGraphRequirements();
  185. reqs.m_RequiresTransforms = new List<NeededTransform>();
  186. reqs.m_RequiresMeshUVs = new List<UVChannel>();
  187. reqs.m_RequiresMeshUVDerivatives = new List<UVChannel>();
  188. foreach (var node in nodes)
  189. {
  190. if (node is IMayRequireTransform a)
  191. reqs.m_RequiresTransforms.AddRange(a.RequiresTransform());
  192. if (node is IMayRequireNormal b)
  193. reqs.m_RequiresNormal |= b.RequiresNormal(stageCapability);
  194. if (node is IMayRequireBitangent c)
  195. reqs.m_RequiresBitangent |= c.RequiresBitangent(stageCapability);
  196. if (node is IMayRequireTangent d)
  197. reqs.m_RequiresTangent |= d.RequiresTangent(stageCapability);
  198. if (node is IMayRequireViewDirection e)
  199. reqs.m_RequiresViewDir |= e.RequiresViewDirection(stageCapability);
  200. if (node is IMayRequirePosition f)
  201. reqs.m_RequiresPosition |= f.RequiresPosition(stageCapability);
  202. if (node is IMayRequirePositionPredisplacement g)
  203. reqs.m_RequiresPositionPredisplacement |= g.RequiresPositionPredisplacement(stageCapability);
  204. if (!reqs.m_RequiresScreenPosition && node is IMayRequireScreenPosition h)
  205. reqs.m_RequiresScreenPosition = h.RequiresScreenPosition(stageCapability);
  206. if (!reqs.m_RequiresNDCPosition && node is IMayRequireNDCPosition i)
  207. reqs.m_RequiresNDCPosition = i.RequiresNDCPosition(stageCapability);
  208. if (!reqs.m_RequiresPixelPosition && node is IMayRequirePixelPosition j)
  209. reqs.m_RequiresPixelPosition = j.RequiresPixelPosition(stageCapability);
  210. if (!reqs.m_RequiresVertexColor && node is IMayRequireVertexColor k)
  211. reqs.m_RequiresVertexColor = k.RequiresVertexColor(stageCapability);
  212. if (!reqs.m_RequiresFaceSign && node is IMayRequireFaceSign l)
  213. reqs.m_RequiresFaceSign = l.RequiresFaceSign(stageCapability);
  214. if (!reqs.m_RequiresDepthTexture && node is IMayRequireDepthTexture m)
  215. reqs.m_RequiresDepthTexture = m.RequiresDepthTexture(stageCapability);
  216. if (!reqs.m_RequiresCameraOpaqueTexture && node is IMayRequireCameraOpaqueTexture n)
  217. reqs.m_RequiresCameraOpaqueTexture = n.RequiresCameraOpaqueTexture(stageCapability);
  218. if (!reqs.m_RequiresTime)
  219. reqs.m_RequiresTime = node.RequiresTime();
  220. if (!reqs.m_RequiresVertexSkinning && node is IMayRequireVertexSkinning o)
  221. reqs.m_RequiresVertexSkinning = o.RequiresVertexSkinning(stageCapability);
  222. if (!reqs.m_RequiresVertexID && node is IMayRequireVertexID p)
  223. reqs.m_RequiresVertexID = p.RequiresVertexID(stageCapability);
  224. if (node is IMayRequireMeshUV q)
  225. {
  226. for (int uvIndex = 0; uvIndex < ShaderGeneratorNames.UVCount; ++uvIndex)
  227. {
  228. var channel = (UVChannel)uvIndex;
  229. if (q.RequiresMeshUV(channel))
  230. {
  231. reqs.m_RequiresMeshUVs.Add(channel);
  232. if (texCoordNeedsDerivs is not null &&
  233. uvIndex < texCoordNeedsDerivs.Length &&
  234. texCoordNeedsDerivs[uvIndex])
  235. {
  236. reqs.m_RequiresMeshUVDerivatives.Add(channel);
  237. }
  238. }
  239. }
  240. }
  241. if (!reqs.m_RequiresInstanceID && node is IMayRequireInstanceID r)
  242. reqs.m_RequiresInstanceID = r.RequiresInstanceID(stageCapability);
  243. }
  244. reqs.m_RequiresTransforms = reqs.m_RequiresTransforms.Distinct().ToList();
  245. // if anything needs tangentspace we have make
  246. // sure to have our othonormal basis!
  247. if (includeIntermediateSpaces)
  248. {
  249. var compoundSpaces = reqs.m_RequiresBitangent | reqs.m_RequiresNormal | reqs.m_RequiresPosition
  250. | reqs.m_RequiresTangent | reqs.m_RequiresViewDir | reqs.m_RequiresPosition
  251. | reqs.m_RequiresNormal;
  252. var needsTangentSpace = (compoundSpaces & NeededCoordinateSpace.Tangent) > 0;
  253. if (needsTangentSpace)
  254. {
  255. reqs.m_RequiresBitangent |= NeededCoordinateSpace.World;
  256. reqs.m_RequiresNormal |= NeededCoordinateSpace.World;
  257. reqs.m_RequiresTangent |= NeededCoordinateSpace.World;
  258. }
  259. }
  260. return reqs;
  261. }
  262. internal static ShaderGraphRequirements FromUvDerivativeList(List<UVChannel> meshUVDerivatives)
  263. {
  264. var reqs = new ShaderGraphRequirements()
  265. {
  266. m_RequiresMeshUVDerivatives = meshUVDerivatives,
  267. };
  268. return reqs;
  269. }
  270. }
  271. }