暫無描述
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.

DrawNormal2DPass.cs 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using UnityEngine.Experimental.Rendering;
  3. using UnityEngine.Rendering.RenderGraphModule;
  4. namespace UnityEngine.Rendering.Universal
  5. {
  6. internal class DrawNormal2DPass : ScriptableRenderPass
  7. {
  8. static readonly string k_NormalPass = "Normal2D Pass";
  9. private static readonly ProfilingSampler m_ProfilingSampler = new ProfilingSampler(k_NormalPass);
  10. private static readonly ShaderTagId k_NormalsRenderingPassName = new ShaderTagId("NormalsRendering");
  11. private class PassData
  12. {
  13. internal RendererListHandle rendererList;
  14. }
  15. [Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
  16. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  17. {
  18. throw new NotImplementedException();
  19. }
  20. private static void Execute(RasterCommandBuffer cmd, PassData passData)
  21. {
  22. cmd.DrawRendererList(passData.rendererList);
  23. }
  24. public void Render(RenderGraph graph, ContextContainer frameData, Renderer2DData rendererData, ref LayerBatch layerBatch, int batchIndex)
  25. {
  26. Universal2DResourceData universal2DResourceData = frameData.Get<Universal2DResourceData>();
  27. int lastBatchIndex = universal2DResourceData.normalsTexture.Length - 1;
  28. // Account for Sprite Mask and normal map usage where the first and last layer has to render the stencil pass
  29. if (!layerBatch.lightStats.useNormalMap)
  30. return;
  31. UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
  32. UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
  33. UniversalLightData lightData = frameData.Get<UniversalLightData>();
  34. using (var builder = graph.AddRasterRenderPass<PassData>(k_NormalPass, out var passData, m_ProfilingSampler))
  35. {
  36. var filterSettings = FilteringSettings.defaultValue;
  37. filterSettings.renderQueueRange = RenderQueueRange.all;
  38. filterSettings.layerMask = -1;
  39. filterSettings.renderingLayerMask = 0xFFFFFFFF;
  40. filterSettings.sortingLayerRange = new SortingLayerRange(layerBatch.layerRange.lowerBound, layerBatch.layerRange.upperBound);
  41. var drawSettings = CreateDrawingSettings(k_NormalsRenderingPassName, renderingData, cameraData, lightData, SortingCriteria.CommonTransparent);
  42. var sortSettings = drawSettings.sortingSettings;
  43. RendererLighting.GetTransparencySortingMode(rendererData, cameraData.camera, ref sortSettings);
  44. drawSettings.sortingSettings = sortSettings;
  45. builder.AllowPassCulling(false);
  46. builder.SetRenderAttachment(universal2DResourceData.normalsTexture[batchIndex], 0);
  47. builder.SetRenderAttachmentDepth(universal2DResourceData.intermediateDepth, AccessFlags.Write);
  48. var param = new RendererListParams(renderingData.cullResults, drawSettings, filterSettings);
  49. passData.rendererList = graph.CreateRendererList(param);
  50. builder.UseRendererList(passData.rendererList);
  51. builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
  52. {
  53. Execute(context.cmd, data);
  54. });
  55. }
  56. }
  57. }
  58. }