Aucune description
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

RenderObjects.cs 8.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. using UnityEngine.Scripting.APIUpdating;
  2. namespace UnityEngine.Rendering.Universal
  3. {
  4. /// <summary>
  5. /// The queue type for the objects to render.
  6. /// </summary>
  7. [MovedFrom(true, "UnityEngine.Experimental.Rendering.Universal")]
  8. public enum RenderQueueType
  9. {
  10. /// <summary>
  11. /// Use this for opaque objects.
  12. /// </summary>
  13. Opaque,
  14. /// <summary>
  15. /// Use this for transparent objects.
  16. /// </summary>
  17. Transparent,
  18. }
  19. /// <summary>
  20. /// The class for the render objects renderer feature.
  21. /// </summary>
  22. [ExcludeFromPreset]
  23. [MovedFrom(true, "UnityEngine.Experimental.Rendering.Universal")]
  24. [Tooltip("Render Objects simplifies the injection of additional render passes by exposing a selection of commonly used settings.")]
  25. [URPHelpURL("renderer-features/renderer-feature-render-objects")]
  26. public class RenderObjects : ScriptableRendererFeature
  27. {
  28. /// <summary>
  29. /// Settings class used for the render objects renderer feature.
  30. /// </summary>
  31. [System.Serializable]
  32. public class RenderObjectsSettings
  33. {
  34. /// <summary>
  35. /// The profiler tag used with the pass.
  36. /// </summary>
  37. public string passTag = "RenderObjectsFeature";
  38. /// <summary>
  39. /// Controls when the render pass executes.
  40. /// </summary>
  41. public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques;
  42. /// <summary>
  43. /// The filter settings for the pass.
  44. /// </summary>
  45. public FilterSettings filterSettings = new FilterSettings();
  46. /// <summary>
  47. /// The override material to use.
  48. /// </summary>
  49. public Material overrideMaterial = null;
  50. /// <summary>
  51. /// The pass index to use with the override material.
  52. /// </summary>
  53. public int overrideMaterialPassIndex = 0;
  54. /// <summary>
  55. /// The override shader to use.
  56. /// </summary>
  57. public Shader overrideShader = null;
  58. /// <summary>
  59. /// The pass index to use with the override shader.
  60. /// </summary>
  61. public int overrideShaderPassIndex = 0;
  62. /// <summary>
  63. /// Options to select which type of override mode should be used.
  64. /// </summary>
  65. public enum OverrideMaterialMode
  66. {
  67. /// <summary>
  68. /// Use this to not override.
  69. /// </summary>
  70. None,
  71. /// <summary>
  72. /// Use this to use an override material.
  73. /// </summary>
  74. Material,
  75. /// <summary>
  76. /// Use this to use an override shader.
  77. /// </summary>
  78. Shader
  79. };
  80. /// <summary>
  81. /// The selected override mode.
  82. /// </summary>
  83. public OverrideMaterialMode overrideMode = OverrideMaterialMode.Material; //default to Material as this was previously the only option
  84. /// <summary>
  85. /// Sets whether it should override depth or not.
  86. /// </summary>
  87. public bool overrideDepthState = false;
  88. /// <summary>
  89. /// The depth comparison function to use.
  90. /// </summary>
  91. public CompareFunction depthCompareFunction = CompareFunction.LessEqual;
  92. /// <summary>
  93. /// Sets whether it should write to depth or not.
  94. /// </summary>
  95. public bool enableWrite = true;
  96. /// <summary>
  97. /// The stencil settings to use.
  98. /// </summary>
  99. public StencilStateData stencilSettings = new StencilStateData();
  100. /// <summary>
  101. /// The camera settings to use.
  102. /// </summary>
  103. public CustomCameraSettings cameraSettings = new CustomCameraSettings();
  104. }
  105. /// <summary>
  106. /// The filter settings used.
  107. /// </summary>
  108. [System.Serializable]
  109. public class FilterSettings
  110. {
  111. // TODO: expose opaque, transparent, all ranges as drop down
  112. /// <summary>
  113. /// The queue type for the objects to render.
  114. /// </summary>
  115. public RenderQueueType RenderQueueType;
  116. /// <summary>
  117. /// The layer mask to use.
  118. /// </summary>
  119. public LayerMask LayerMask;
  120. /// <summary>
  121. /// The passes to render.
  122. /// </summary>
  123. public string[] PassNames;
  124. /// <summary>
  125. /// The constructor for the filter settings.
  126. /// </summary>
  127. public FilterSettings()
  128. {
  129. RenderQueueType = RenderQueueType.Opaque;
  130. LayerMask = 0;
  131. }
  132. }
  133. /// <summary>
  134. /// The settings for custom cameras values.
  135. /// </summary>
  136. [System.Serializable]
  137. public class CustomCameraSettings
  138. {
  139. /// <summary>
  140. /// Used to mark whether camera values should be changed or not.
  141. /// </summary>
  142. public bool overrideCamera = false;
  143. /// <summary>
  144. /// Should the values be reverted after rendering the objects?
  145. /// </summary>
  146. public bool restoreCamera = true;
  147. /// <summary>
  148. /// Changes the camera offset.
  149. /// </summary>
  150. public Vector4 offset;
  151. /// <summary>
  152. /// Changes the camera field of view.
  153. /// </summary>
  154. public float cameraFieldOfView = 60.0f;
  155. }
  156. /// <summary>
  157. /// The settings used for the Render Objects renderer feature.
  158. /// </summary>
  159. public RenderObjectsSettings settings = new RenderObjectsSettings();
  160. RenderObjectsPass renderObjectsPass;
  161. /// <inheritdoc/>
  162. public override void Create()
  163. {
  164. FilterSettings filter = settings.filterSettings;
  165. // Render Objects pass doesn't support events before rendering prepasses.
  166. // The camera is not setup before this point and all rendering is monoscopic.
  167. // Events before BeforeRenderingPrepasses should be used for input texture passes (shadow map, LUT, etc) that doesn't depend on the camera.
  168. // These events are filtering in the UI, but we still should prevent users from changing it from code or
  169. // by changing the serialized data.
  170. if (settings.Event < RenderPassEvent.BeforeRenderingPrePasses)
  171. settings.Event = RenderPassEvent.BeforeRenderingPrePasses;
  172. renderObjectsPass = new RenderObjectsPass(settings.passTag, settings.Event, filter.PassNames,
  173. filter.RenderQueueType, filter.LayerMask, settings.cameraSettings);
  174. switch (settings.overrideMode)
  175. {
  176. case RenderObjectsSettings.OverrideMaterialMode.None:
  177. renderObjectsPass.overrideMaterial = null;
  178. renderObjectsPass.overrideShader = null;
  179. break;
  180. case RenderObjectsSettings.OverrideMaterialMode.Material:
  181. renderObjectsPass.overrideMaterial = settings.overrideMaterial;
  182. renderObjectsPass.overrideMaterialPassIndex = settings.overrideMaterialPassIndex;
  183. renderObjectsPass.overrideShader = null;
  184. break;
  185. case RenderObjectsSettings.OverrideMaterialMode.Shader:
  186. renderObjectsPass.overrideMaterial = null;
  187. renderObjectsPass.overrideShader = settings.overrideShader;
  188. renderObjectsPass.overrideShaderPassIndex = settings.overrideShaderPassIndex;
  189. break;
  190. }
  191. if (settings.overrideDepthState)
  192. renderObjectsPass.SetDepthState(settings.enableWrite, settings.depthCompareFunction);
  193. if (settings.stencilSettings.overrideStencilState)
  194. renderObjectsPass.SetStencilState(settings.stencilSettings.stencilReference,
  195. settings.stencilSettings.stencilCompareFunction, settings.stencilSettings.passOperation,
  196. settings.stencilSettings.failOperation, settings.stencilSettings.zFailOperation);
  197. }
  198. /// <inheritdoc/>
  199. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
  200. {
  201. if (renderingData.cameraData.cameraType == CameraType.Preview
  202. || UniversalRenderer.IsOffscreenDepthTexture(ref renderingData.cameraData))
  203. return;
  204. renderer.EnqueuePass(renderObjectsPass);
  205. }
  206. internal override bool SupportsNativeRenderPass()
  207. {
  208. return true;
  209. }
  210. }
  211. }