@@ -50,21 +50,22 @@ public class EffekseerURPRenderPassFeature : ScriptableRendererFeature
5050
5151 class EffekseerRenderPassURP : UnityEngine . Rendering . Universal . ScriptableRenderPass
5252 {
53- #if ! EFFEKSEER_URP_DEPTHTARGET_FIX
54- RenderTargetIdentifier cameraColorTarget ;
55- RenderTargetIdentifier cameraDepthTarget ;
56- #endif
5753 Effekseer . Internal . RenderTargetProperty prop = new Effekseer . Internal . RenderTargetProperty ( ) ;
58- private IEffekseerBlitter blitter = new UrpBlitter ( ) ;
54+ private readonly IEffekseerBlitter blitter = new UrpBlitter ( ) ;
5955 UnityEngine . LayerMask layerMask ;
6056 private const string RenderPassName = nameof ( EffekseerRenderPassURP ) ;
6157
62- public EffekseerRenderPassURP ( ScriptableRenderer renderer , UnityEngine . LayerMask layerMask )
58+ public EffekseerRenderPassURP ( UnityEngine . LayerMask layerMask )
6359 {
6460 this . renderPassEvent = UnityEngine . Rendering . Universal . RenderPassEvent . AfterRenderingTransparents ;
6561 this . layerMask = layerMask ;
6662 }
6763
64+ public void SetLayerMask ( UnityEngine . LayerMask layerMask )
65+ {
66+ this . layerMask = layerMask ;
67+ }
68+
6869 bool IsValidCameraDepthTarget ( RenderTargetIdentifier cameraDepthTarget )
6970 {
7071 // HACK: When using URP, the depth might be either written to a DepthBuffer attached to
@@ -92,45 +93,41 @@ bool IsValidCameraDepthTarget(RenderTargetIdentifier cameraDepthTarget)
9293 return ! identifierString . Contains ( "NameID -1" ) || ! identifierString . Contains ( "InstanceID 0" ) ;
9394 }
9495
95- #if ! EFFEKSEER_URP_DEPTHTARGET_FIX
96- public void Setup ( RenderTargetIdentifier cameraColorTarget , RenderTargetIdentifier cameraDepthTarget )
96+ void PrepareRenderTargetProperty ( RenderTargetProperty renderTargetProperty , RenderTextureDescriptor colorTargetDescriptor , bool requiresDepthTexture , bool xrRendering )
9797 {
98- bool isValidDepth = IsValidCameraDepthTarget ( cameraDepthTarget ) ;
99-
100- this . cameraColorTarget = cameraColorTarget ;
101- prop . colorTargetIdentifier = cameraColorTarget ;
102- this . renderPassEvent = UnityEngine . Rendering . Universal . RenderPassEvent . AfterRenderingTransparents ;
98+ renderTargetProperty . colorBufferID = null ;
99+ renderTargetProperty . depthTargetIdentifier = null ;
100+ renderTargetProperty . colorTargetRenderTexture = null ;
101+ renderTargetProperty . depthTargetRenderTexture = null ;
102+ renderTargetProperty . ActualScreenSize = null ;
103+ renderTargetProperty . Viewport = null ;
104+ renderTargetProperty . SourceViewport = null ;
105+ renderTargetProperty . isRequiredToChangeViewport = false ;
106+ renderTargetProperty . colorTargetDescriptor = colorTargetDescriptor ;
103107
104- if ( isValidDepth )
105- {
106- this . cameraDepthTarget = cameraDepthTarget ;
107- prop . depthTargetIdentifier = cameraDepthTarget ;
108- }
108+ // Linear and native renderer makes a result white.
109+ renderTargetProperty . colorTargetDescriptor . sRGB = false ;
110+ renderTargetProperty . isRequiredToCopyBackground = true ;
111+ renderTargetProperty . renderFeature = Effekseer . Internal . RenderFeature . URP ;
112+ renderTargetProperty . canGrabDepth = requiresDepthTexture ;
113+ renderTargetProperty . xrRendering = xrRendering ;
109114 }
110- #endif
111115
112116#if UNITY_6000_0_OR_NEWER
113117 [ Obsolete ]
114118#endif
115119 public override void Execute ( ScriptableRenderContext context , ref UnityEngine . Rendering . Universal . RenderingData renderingData )
116120 {
117121 if ( Effekseer . EffekseerSystem . Instance == null ) return ;
118- #if EFFEKSEER_URP_DEPTHTARGET_FIX
122+ var xrRendering = renderingData . cameraData . xrRendering ;
123+ PrepareRenderTargetProperty ( prop , renderingData . cameraData . cameraTargetDescriptor , renderingData . cameraData . requiresDepthTexture , xrRendering ) ;
119124 var renderer = renderingData . cameraData . renderer ;
120- #if UNITY_2022_3_OR_NEWER
121125 prop . colorTargetIdentifier = renderer . cameraColorTargetHandle ;
122- #else
123- prop . colorTargetIdentifier = renderer . cameraColorTarget ;
124- #endif
125126
126127 // NOTE: We need to know whether the depth in cameraDepthTarget is valid or not since if it is valid,
127128 // we need to pass cameraDepthTarget to SetRenderTarget() later on. If it isn't valid, the depth in
128129 // cameraColorTarget is used instead.
129- #if UNITY_2022_3_OR_NEWER
130130 var cameraDepthTarget = renderer . cameraDepthTargetHandle ;
131- #else
132- var cameraDepthTarget = renderer . cameraDepthTarget ;
133- #endif
134131 var isValidDepth = IsValidCameraDepthTarget ( cameraDepthTarget ) ;
135132
136133 if ( isValidDepth )
@@ -141,20 +138,8 @@ public override void Execute(ScriptableRenderContext context, ref UnityEngine.Re
141138 {
142139 prop . depthTargetIdentifier = null ;
143140 }
144- #endif
145- prop . colorTargetDescriptor = renderingData . cameraData . cameraTargetDescriptor ;
146-
147- // Linear and native renderer makes a result white.
148- prop . colorTargetDescriptor . sRGB = false ;
149-
150- prop . isRequiredToCopyBackground = true ;
151- prop . renderFeature = Effekseer . Internal . RenderFeature . URP ;
152- #if EFFEKSEER_URP_XRRENDERING
153- prop . xrRendering = renderingData . cameraData . xrRendering ;
154- #endif
155141
156142 var cmd = CommandBufferPool . Get ( RenderPassName ) ;
157- prop . canGrabDepth = renderingData . cameraData . requiresDepthTexture ;
158143 Effekseer . EffekseerSystem . Instance . renderer . Render ( renderingData . cameraData . camera , layerMask . value , prop , cmd , true , blitter ) ;
159144 context . ExecuteCommandBuffer ( cmd ) ;
160145 CommandBufferPool . Release ( cmd ) ;
@@ -163,82 +148,60 @@ public override void Execute(ScriptableRenderContext context, ref UnityEngine.Re
163148#if UNITY_6000_0_OR_NEWER
164149 class PassData
165150 {
151+ public Camera camera ;
152+ public int layerMask ;
166153 public TextureHandle colorTexture ;
167154 public TextureHandle depthTexture ;
168155
169156 public Effekseer . Internal . RenderTargetProperty prop = new ( ) ;
170157 public IEffekseerBlitter blitter = new UrpBlitter ( ) ;
171158 }
172159
173- class DummyPassData
160+ static void ExecuteRenderGraphPass ( PassData passData , UnsafeGraphContext context )
174161 {
162+ var system = Effekseer . EffekseerSystem . Instance ;
163+ if ( system == null || passData . camera == null )
164+ {
165+ return ;
166+ }
167+
168+ var commandBuffer = CommandBufferHelpers . GetNativeCommandBuffer ( context . cmd ) ;
169+ passData . prop . colorTargetIdentifier = ( RenderTargetIdentifier ) passData . colorTexture ;
170+ passData . prop . depthTargetIdentifier = passData . depthTexture . IsValid ( ) ? ( RenderTargetIdentifier ) passData . depthTexture : ( RenderTargetIdentifier ? ) null ;
171+ system . renderer . Render ( passData . camera , passData . layerMask , passData . prop , commandBuffer , true , passData . blitter ) ;
175172 }
176173
177174 public override void RecordRenderGraph ( RenderGraph renderGraph , ContextContainer frameData )
178175 {
179176 if ( Effekseer . EffekseerSystem . Instance == null ) return ;
180177
181- string profilerTag = "EffekseerPath" ;
182- string profilerDummyTag = "EffekseerDummyPath" ;
183-
184178 UniversalCameraData cameraData = frameData . Get < UniversalCameraData > ( ) ;
185-
186- using ( var builder = renderGraph . AddUnsafePass < PassData > ( profilerTag , out var passData ) )
179+ UniversalResourceData resourceData = frameData . Get < UniversalResourceData > ( ) ;
180+ var colorTexture = resourceData . activeColorTexture ;
181+ if ( ! colorTexture . IsValid ( ) )
187182 {
188- UniversalResourceData resourceData = frameData . Get < UniversalResourceData > ( ) ;
183+ return ;
184+ }
189185
190- passData . blitter = this . blitter ;
186+ var xrRendering = cameraData . xrRendering ;
191187
192- //passData.prop.colorTargetIdentifier = resourceData.activeColorTexture;
193- //passData.prop.depthTargetIdentifier = resourceData.activeDepthTexture;
194- passData . colorTexture = resourceData . activeColorTexture ;
188+ using ( var builder = renderGraph . AddUnsafePass < PassData > ( "EffekseerPass" , out var passData , profilingSampler ) )
189+ {
190+ passData . camera = cameraData . camera ;
191+ passData . layerMask = layerMask . value ;
192+ passData . blitter = this . blitter ;
193+ passData . colorTexture = colorTexture ;
195194 builder . UseTexture ( passData . colorTexture , AccessFlags . ReadWrite ) ;
196195 passData . depthTexture = resourceData . activeDepthTexture ;
197- builder . UseTexture ( passData . depthTexture , AccessFlags . ReadWrite ) ;
198- passData . prop . colorTargetDescriptor = cameraData . cameraTargetDescriptor ;
199-
200- // Linear and native renderer makes a result white.
201- passData . prop . colorTargetDescriptor . sRGB = false ;
202-
203- passData . prop . isRequiredToCopyBackground = true ;
204- passData . prop . renderFeature = Effekseer . Internal . RenderFeature . URP ;
205- #if EFFEKSEER_URP_XRRENDERING
206- passData . prop . xrRendering = cameraData . xrRendering ;
207- #endif
208- passData . prop . canGrabDepth = cameraData . requiresDepthTexture ;
209-
210- builder . AllowPassCulling ( false ) ;
211- builder . AllowGlobalStateModification ( true ) ;
212-
213- builder . SetRenderFunc ( ( PassData passData , UnsafeGraphContext context ) =>
196+ if ( passData . depthTexture . IsValid ( ) )
214197 {
215- using ( new ProfilingScope ( context . cmd , profilingSampler ) )
216- {
217- var commandBuffer = CommandBufferHelpers . GetNativeCommandBuffer ( context . cmd ) ;
218- passData . prop . colorTargetIdentifier = passData . colorTexture ;
219- passData . prop . depthTargetIdentifier = passData . depthTexture ;
198+ builder . UseTexture ( passData . depthTexture , AccessFlags . Write ) ;
199+ }
200+ PrepareRenderTargetProperty ( passData . prop , cameraData . cameraTargetDescriptor , cameraData . requiresDepthTexture , xrRendering ) ;
220201
221- Effekseer . EffekseerSystem . Instance . renderer . Render ( cameraData . camera , layerMask . value , passData . prop , commandBuffer , true , passData . blitter ) ;
222- }
223- } ) ;
224- }
225-
226- // HACK : Dummy pass to ensure that the render graph is executed
227- using ( var builder = renderGraph . AddRasterRenderPass < DummyPassData > ( profilerDummyTag , out var passData ) )
228- {
229- UniversalResourceData resourceData = frameData . Get < UniversalResourceData > ( ) ;
230- builder . SetRenderAttachment ( resourceData . activeColorTexture , 0 ) ;
231202 builder . AllowPassCulling ( false ) ;
232203 builder . AllowGlobalStateModification ( true ) ;
233-
234- builder . SetRenderFunc ( ( DummyPassData passData , RasterGraphContext context ) =>
235- {
236- using ( new ProfilingScope ( context . cmd , profilingSampler ) )
237- {
238- context . cmd . BeginSample ( profilerDummyTag ) ;
239- context . cmd . EndSample ( profilerDummyTag ) ;
240- }
241- } ) ;
204+ builder . SetRenderFunc ( static ( PassData passData , UnsafeGraphContext context ) => ExecuteRenderGraphPass ( passData , context ) ) ;
242205 }
243206 }
244207#endif
@@ -248,23 +211,14 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer
248211
249212 public override void Create ( )
250213 {
214+ m_ScriptablePass = new EffekseerRenderPassURP ( LayerMask ) ;
251215 }
252216
253217 public override void AddRenderPasses ( ScriptableRenderer renderer , ref RenderingData renderingData )
254218 {
255- #if ! EFFEKSEER_URP_DEPTHTARGET_FIX
256- if ( m_ScriptablePass == null )
257- {
258- m_ScriptablePass = new EffekseerRenderPassURP ( renderer , LayerMask ) ;
259- }
260-
261- m_ScriptablePass . Setup ( renderer . cameraColorTarget , renderer . cameraDepth ) ;
262-
219+ m_ScriptablePass = m_ScriptablePass ?? new EffekseerRenderPassURP ( LayerMask ) ;
220+ m_ScriptablePass . SetLayerMask ( LayerMask ) ;
263221 renderer . EnqueuePass ( m_ScriptablePass ) ;
264- #else
265- m_ScriptablePass = m_ScriptablePass ?? new EffekseerRenderPassURP ( renderer , LayerMask ) ;
266- renderer . EnqueuePass ( m_ScriptablePass ) ;
267- #endif
268222 }
269223}
270224
0 commit comments