diff --git a/Resources/VXGI/Shader/Utility.shader b/Resources/VXGI/Shader/Utility.shader index 19c73f9..988e8df 100644 --- a/Resources/VXGI/Shader/Utility.shader +++ b/Resources/VXGI/Shader/Utility.shader @@ -9,6 +9,26 @@ Shader "Hidden/VXGI/Utility" { ZWrite Off + Pass + { + Name "BlitViewport" + + HLSLPROGRAM + #pragma vertex BlitViewportVertex + #pragma fragment frag + + #include "UnityCG.cginc" + #include "Packages/com.looooong.srp.vxgi/ShaderLibrary/BlitSupport.hlsl" + + sampler2D _MainTex; + + float4 frag(BlitInput i) : SV_TARGET + { + return tex2D(_MainTex, i.uv); + } + ENDHLSL + } + Pass { Name "DepthCopy" @@ -38,6 +58,35 @@ Shader "Hidden/VXGI/Utility" ENDHLSL } + Pass + { + Name "DepthCopyViewport" + + BlendOp Min, Max + ZWrite On + + HLSLPROGRAM + #pragma vertex BlitViewportVertex + #pragma fragment frag + + #include "UnityCG.cginc" + #include "Packages/com.looooong.srp.vxgi/ShaderLibrary/BlitSupport.hlsl" + + sampler2D _CameraDepthTexture; + + float4 frag(BlitInput i, out float depth : SV_DEPTH) : SV_TARGET + { + depth = tex2D(_CameraDepthTexture, i.uv).r; + + if (Linear01Depth(depth) < 1.0) { + return float4(0.0, 0.0, 0.0, 1.0); + } else { + return 1.0; + } + } + ENDHLSL + } + Pass { Name "EncodeDepthNormal" @@ -80,12 +129,16 @@ Shader "Hidden/VXGI/Utility" }; sampler2D _MainTex; + float4 BlitViewport; v2f vert(appdata_base v) { + v.vertex.xy = (v.vertex.xy - BlitViewport.zw) / BlitViewport.xy; + v2f o; o.position = UnityObjectToClipPos(v.vertex); o.uv = ComputeScreenPos(o.position); + o.uv.xy = mad(o.uv.xy, BlitViewport.xy, BlitViewport.zw); #ifdef PROJECTION_PARAMS_X if (_ProjectionParams.x < 0.0) o.uv.y = 1.0 - o.uv.y; diff --git a/Runtime/SRP/VXGIRenderer.cs b/Runtime/SRP/VXGIRenderer.cs index 9ce69b3..598ca4f 100644 --- a/Runtime/SRP/VXGIRenderer.cs +++ b/Runtime/SRP/VXGIRenderer.cs @@ -118,7 +118,8 @@ public void RenderDeferred(ScriptableRenderContext renderContext, Camera camera, TriggerCameraEvent(renderContext, camera, CameraEvent.BeforeImageEffects, vxgi); RenderPostProcessing(renderContext, camera); - _command.Blit(ShaderIDs.FrameBuffer, BuiltinRenderTextureType.CameraTarget); + _command.SetGlobalVector(ShaderIDs.BlitViewport, new Vector4(camera.rect.width, camera.rect.height, camera.rect.xMin, camera.rect.yMin)); + _command.Blit(ShaderIDs.FrameBuffer, BuiltinRenderTextureType.CameraTarget, UtilityShader.material, (int)UtilityShader.Pass.BlitViewport); renderContext.ExecuteCommandBuffer(_command); _command.Clear(); TriggerCameraEvent(renderContext, camera, CameraEvent.AfterImageEffects, vxgi); @@ -143,8 +144,9 @@ public void RenderDeferred(ScriptableRenderContext renderContext, Camera camera, } void CopyCameraTargetToFrameBuffer(ScriptableRenderContext renderContext, Camera camera) { - _command.GetTemporaryRT(ShaderIDs.Dummy, camera.pixelWidth, camera.pixelHeight, 0, FilterMode.Point, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); - _command.Blit(ShaderIDs._CameraDepthTexture, BuiltinRenderTextureType.CameraTarget, UtilityShader.material, (int)UtilityShader.Pass.DepthCopy); + _command.GetTemporaryRT(ShaderIDs.Dummy, Screen.width, Screen.height, 0, FilterMode.Point, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); + _command.SetGlobalVector(ShaderIDs.BlitViewport, new Vector4(camera.rect.width, camera.rect.height, camera.rect.xMin, camera.rect.yMin)); + _command.Blit(ShaderIDs._CameraDepthTexture, BuiltinRenderTextureType.CameraTarget, UtilityShader.material, (int)UtilityShader.Pass.DepthCopyViewport); _command.Blit(BuiltinRenderTextureType.CameraTarget, ShaderIDs.Dummy); _command.Blit(ShaderIDs.Dummy, ShaderIDs.FrameBuffer, UtilityShader.material, (int)UtilityShader.Pass.GrabCopy); _command.ReleaseTemporaryRT(ShaderIDs.Dummy); diff --git a/Runtime/ShaderPasses/UtilityShader.cs b/Runtime/ShaderPasses/UtilityShader.cs index 3349d94..de4d0e8 100644 --- a/Runtime/ShaderPasses/UtilityShader.cs +++ b/Runtime/ShaderPasses/UtilityShader.cs @@ -2,10 +2,12 @@ public static class UtilityShader { public enum Pass { - DepthCopy = 0, - EncodeDepthNormal = 1, - GrabCopy = 2, - LowResComposite = 3 + BlitViewport, + DepthCopy, + DepthCopyViewport, + EncodeDepthNormal, + GrabCopy, + LowResComposite } public static Material material { diff --git a/Runtime/Utilities/ShaderIDs.cs b/Runtime/Utilities/ShaderIDs.cs index 0842270..54df8fa 100644 --- a/Runtime/Utilities/ShaderIDs.cs +++ b/Runtime/Utilities/ShaderIDs.cs @@ -21,6 +21,7 @@ internal static class ShaderIDs { internal static readonly int _CameraGBufferTexture2 = Shader.PropertyToID("_CameraGBufferTexture2"); internal static readonly int _CameraGBufferTexture3 = Shader.PropertyToID("_CameraGBufferTexture3"); internal static readonly int Arguments = Shader.PropertyToID("Arguments"); + internal static readonly int BlitViewport = Shader.PropertyToID("BlitViewport"); internal static readonly int ClipToVoxel = Shader.PropertyToID("ClipToVoxel"); internal static readonly int ClipToWorld = Shader.PropertyToID("ClipToWorld"); internal static readonly int Displacement = Shader.PropertyToID("Displacement"); diff --git a/ShaderLibrary/BlitSupport.hlsl b/ShaderLibrary/BlitSupport.hlsl index d3b4ea5..636342e 100644 --- a/ShaderLibrary/BlitSupport.hlsl +++ b/ShaderLibrary/BlitSupport.hlsl @@ -13,6 +13,8 @@ struct BlitInput float2 uv : TEXCOORD; }; +float4 BlitViewport; + BlitInput BlitVertex(appdata_base v) { BlitInput o; @@ -21,4 +23,14 @@ BlitInput BlitVertex(appdata_base v) return o; } +BlitInput BlitViewportVertex(appdata_base v) +{ + v.vertex.xy = mad(v.vertex.xy, BlitViewport.xy, BlitViewport.zw); + + BlitInput o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord; + return o; +} + #endif