説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

DebugRenderSetup.cs 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using System;
  2. using UnityEngine.Experimental.Rendering;
  3. using UnityEngine.Rendering.RenderGraphModule;
  4. namespace UnityEngine.Rendering.Universal
  5. {
  6. class DebugRenderSetup : IDisposable
  7. {
  8. private readonly DebugHandler m_DebugHandler;
  9. private readonly FilteringSettings m_FilteringSettings;
  10. private readonly int m_Index;
  11. private DebugDisplaySettingsMaterial MaterialSettings => m_DebugHandler.DebugDisplaySettings.materialSettings;
  12. private DebugDisplaySettingsRendering RenderingSettings => m_DebugHandler.DebugDisplaySettings.renderingSettings;
  13. private DebugDisplaySettingsLighting LightingSettings => m_DebugHandler.DebugDisplaySettings.lightingSettings;
  14. internal void Begin(RasterCommandBuffer cmd)
  15. {
  16. DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.sceneOverrideMode;
  17. switch (sceneOverrideMode)
  18. {
  19. case DebugSceneOverrideMode.Wireframe:
  20. {
  21. cmd.SetWireframe(true);
  22. break;
  23. }
  24. case DebugSceneOverrideMode.SolidWireframe:
  25. case DebugSceneOverrideMode.ShadedWireframe:
  26. {
  27. if (m_Index == 1)
  28. {
  29. cmd.SetWireframe(true);
  30. }
  31. break;
  32. }
  33. }
  34. m_DebugHandler.SetupShaderProperties(cmd, m_Index);
  35. }
  36. internal void End(RasterCommandBuffer cmd)
  37. {
  38. DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.sceneOverrideMode;
  39. switch (sceneOverrideMode)
  40. {
  41. case DebugSceneOverrideMode.Wireframe:
  42. {
  43. cmd.SetWireframe(false);
  44. break;
  45. }
  46. case DebugSceneOverrideMode.SolidWireframe:
  47. case DebugSceneOverrideMode.ShadedWireframe:
  48. {
  49. if (m_Index == 1)
  50. {
  51. cmd.SetWireframe(false);
  52. }
  53. break;
  54. }
  55. }
  56. }
  57. internal DebugRenderSetup(DebugHandler debugHandler,
  58. int index,
  59. FilteringSettings filteringSettings)
  60. {
  61. m_DebugHandler = debugHandler;
  62. m_FilteringSettings = filteringSettings;
  63. m_Index = index;
  64. }
  65. internal void CreateRendererList(
  66. ScriptableRenderContext context,
  67. ref CullingResults cullResults,
  68. ref DrawingSettings drawingSettings,
  69. ref FilteringSettings filteringSettings,
  70. ref RenderStateBlock renderStateBlock,
  71. ref RendererList rendererList)
  72. {
  73. RenderingUtils.CreateRendererListWithRenderStateBlock(context, ref cullResults, drawingSettings, filteringSettings, renderStateBlock, ref rendererList);
  74. }
  75. internal void CreateRendererList(
  76. RenderGraph renderGraph,
  77. ref CullingResults cullResults,
  78. ref DrawingSettings drawingSettings,
  79. ref FilteringSettings filteringSettings,
  80. ref RenderStateBlock renderStateBlock,
  81. ref RendererListHandle rendererListHdl)
  82. {
  83. RenderingUtils.CreateRendererListWithRenderStateBlock(renderGraph, ref cullResults, drawingSettings, filteringSettings, renderStateBlock, ref rendererListHdl);
  84. }
  85. internal void DrawWithRendererList(RasterCommandBuffer cmd, ref RendererList rendererList)
  86. {
  87. if(rendererList.isValid)
  88. cmd.DrawRendererList(rendererList);
  89. }
  90. internal DrawingSettings CreateDrawingSettings(DrawingSettings drawingSettings)
  91. {
  92. bool usesReplacementMaterial = (MaterialSettings.vertexAttributeDebugMode != DebugVertexAttributeMode.None);
  93. if (usesReplacementMaterial)
  94. {
  95. Material replacementMaterial = m_DebugHandler.ReplacementMaterial;
  96. DrawingSettings modifiedDrawingSettings = drawingSettings;
  97. modifiedDrawingSettings.overrideMaterial = replacementMaterial;
  98. modifiedDrawingSettings.overrideMaterialPassIndex = 0;
  99. return modifiedDrawingSettings;
  100. }
  101. // No overrides, return original
  102. return drawingSettings;
  103. }
  104. internal RenderStateBlock GetRenderStateBlock(RenderStateBlock renderStateBlock)
  105. {
  106. DebugSceneOverrideMode sceneOverrideMode = RenderingSettings.sceneOverrideMode;
  107. // Potentially override parts of the RenderStateBlock
  108. switch (sceneOverrideMode)
  109. {
  110. case DebugSceneOverrideMode.Overdraw:
  111. {
  112. var isOpaque = m_FilteringSettings.renderQueueRange == RenderQueueRange.opaque || m_FilteringSettings.renderQueueRange == RenderQueueRange.all;
  113. var isTransparent = m_FilteringSettings.renderQueueRange == RenderQueueRange.transparent || m_FilteringSettings.renderQueueRange == RenderQueueRange.all;
  114. var overdrawOpaque =
  115. m_DebugHandler.DebugDisplaySettings.renderingSettings.overdrawMode == DebugOverdrawMode.Opaque
  116. || m_DebugHandler.DebugDisplaySettings.renderingSettings.overdrawMode == DebugOverdrawMode.All;
  117. var overdrawTransparent =
  118. m_DebugHandler.DebugDisplaySettings.renderingSettings.overdrawMode == DebugOverdrawMode.Transparent
  119. || m_DebugHandler.DebugDisplaySettings.renderingSettings.overdrawMode == DebugOverdrawMode.All;
  120. var blendOverdraw = isOpaque && overdrawOpaque || isTransparent && overdrawTransparent;
  121. var destination = blendOverdraw ? BlendMode.One : BlendMode.Zero;
  122. RenderTargetBlendState additiveBlend = new RenderTargetBlendState(sourceColorBlendMode: BlendMode.One, destinationColorBlendMode: destination);
  123. // Additive-blend but leave z-write and culling as they are when we draw normally
  124. renderStateBlock.blendState = new BlendState { blendState0 = additiveBlend };
  125. renderStateBlock.mask = RenderStateMask.Blend;
  126. break;
  127. }
  128. case DebugSceneOverrideMode.SolidWireframe:
  129. case DebugSceneOverrideMode.ShadedWireframe:
  130. {
  131. if (m_Index == 1)
  132. {
  133. // Ensure we render the wireframe in front of the solid triangles of the previous pass...
  134. renderStateBlock.rasterState = new RasterState(offsetUnits: -1, offsetFactor: -1);
  135. renderStateBlock.mask = RenderStateMask.Raster;
  136. }
  137. break;
  138. }
  139. }
  140. return renderStateBlock;
  141. }
  142. internal int GetIndex() { return m_Index; }
  143. public void Dispose()
  144. {
  145. }
  146. }
  147. }