Ejemplo n.º 1
0
    // This function is called from the custom post process at the before post process injection point, just after TAA
    public void RenderVideoObjects(CommandBuffer cmd)
    {
        // Fix depth buffer jittering
        if (fixDepthBufferJittering)
        {
            using (new ProfilingScope(cmd, new ProfilingSampler("Render Depth Buffer without jittering")))
            {
                // We need to re-render everything to get the non-jittered depth buffer :/
                CoreUtils.SetRenderTarget(cmd, videoDepthBuffer);
                CoreUtils.ClearRenderTarget(cmd, ClearFlag.Depth, Color.black);
                var tags   = new ShaderTagId[] { new ShaderTagId("DepthForwardOnly"), new ShaderTagId("DepthOnly") };
                var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(tags, context.cullingResults, context.hdCamera.camera)
                {
                    rendererConfiguration      = PerObjectData.None,
                    renderQueueRange           = RenderQueueRange.all,
                    sortingCriteria            = SortingCriteria.CommonOpaque,
                    excludeObjectMotionVectors = false,
                    layerMask = fixDepthBufferJitteringMask,
                    // stateBlock = overrideRenderState,
                };
                CoreUtils.DrawRendererList(context.renderContext, context.cmd, context.renderContext.CreateRendererList(result));
            }
        }

        // TODO: add an option to render the "frame" objects in the unjittered depth-buffer to avoid flickering
        CoreUtils.SetRenderTarget(cmd, videoColorBuffer, fixDepthBufferJittering ? videoDepthBuffer : context.cameraDepthBuffer, ClearFlag.Color);
        var renderState = new RenderStateBlock(RenderStateMask.Depth)
        {
            depthState = new DepthState(false, CompareFunction.LessEqual)
        };

        CustomPassUtils.DrawRenderers(context, videoObjectMask, overrideRenderState: renderState);
    }
Ejemplo n.º 2
0
    void RenderObjects(ScriptableRenderContext renderContext, CommandBuffer cmd, Material overrideMaterial, int passIndex, CompareFunction depthCompare, CullingResults cullingResult, HDCamera hdCamera, StencilState?overrideStencil = null)
    {
        // Render the objects in the layer blur mask into a mask buffer with their materials so we keep the alpha-clip and transparency if there is any.
        var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(shaderTags, cullingResult, hdCamera.camera)
        {
            rendererConfiguration      = PerObjectData.None,
            renderQueueRange           = RenderQueueRange.all,
            sortingCriteria            = SortingCriteria.BackToFront,
            excludeObjectMotionVectors = false,
            overrideMaterial           = overrideMaterial,
            overrideMaterialPassIndex  = passIndex,
            layerMask  = seeThroughLayer,
            stateBlock = new RenderStateBlock(RenderStateMask.Depth)
            {
                depthState = new DepthState(true, depthCompare)
            },
        };

        if (overrideStencil != null)
        {
            var block = result.stateBlock.Value;
            block.mask        |= RenderStateMask.Stencil;
            block.stencilState = overrideStencil.Value;
            result.stateBlock  = block;
        }

        CoreUtils.DrawRendererList(renderContext, cmd, renderContext.CreateRendererList(result));
    }
Ejemplo n.º 3
0
    protected override void Execute(CustomPassContext ctx)
    {
        if (!ctx.hdCamera.frameSettings.IsEnabled(FrameSettingsField.ObjectMotionVectors) ||
            !ctx.hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects))
        {
            Debug.Log("Motion Vectors are disabled on the camera!");
            return;
        }

        SyncRenderTextureAspect(motionVectorTexture, ctx.hdCamera.camera);

        var tags = new ShaderTagId("MotionVectors");
        var motionVectorRendererListDesc = new UnityEngine.Rendering.RendererUtils.RendererListDesc(tags, ctx.cullingResults, ctx.hdCamera.camera)
        {
            rendererConfiguration      = PerObjectData.MotionVectors,
            renderQueueRange           = RenderQueueRange.all,
            sortingCriteria            = SortingCriteria.BackToFront,
            excludeObjectMotionVectors = false,
            layerMask = renderingMask
        };

        if (ctx.hdCamera.msaaSamples != MSAASamples.None)
        {
            CoreUtils.SetRenderTarget(ctx.cmd, new RenderTargetIdentifier[] { dummy.colorBuffer, motionVectorTexture }, dummy.depthBuffer, ClearFlag.All);
        }
        else
        {
            CoreUtils.SetRenderTarget(ctx.cmd, new RenderTargetIdentifier[] { motionVectorTexture }, motionVectorTexture.depthBuffer, ClearFlag.All);
        }
        CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(motionVectorRendererListDesc));
    }
        public unsafe RendererList CreateRendererList(RendererUtils.RendererListDesc desc)
        {
            Validate();
            RendererListParams param = RendererUtils.RendererListDesc.ConvertToParameters(desc);
            var list = CreateRendererList(ref param);

            param.Dispose();
            return(list);
        }
        // RendererList public API
        public unsafe RendererUtils.RendererList CreateRendererList(RendererUtils.RendererListDesc desc)
        {
            Validate();
            RendererUtils.RendererListParams param = RendererUtils.RendererListParams.Create(desc);

            if (param.stateBlock == null)
            {
                return(CreateRendererList_Internal(param.cullingResult.ptr, ref param.drawSettings, ref param.filteringSettings, ShaderTagId.none, false, IntPtr.Zero, IntPtr.Zero, 0));
            }
            else
            {
                var renderType                  = new ShaderTagId();
                var renderStateBlock            = param.stateBlock.Value;
                RenderStateBlock *stateBlockPtr = &renderStateBlock;
                {
                    return(CreateRendererList_Internal(param.cullingResult.ptr, ref param.drawSettings, ref param.filteringSettings, ShaderTagId.none, false, (IntPtr)(&renderType), (IntPtr)stateBlockPtr, 1));
                }
            }
        }
Ejemplo n.º 6
0
    public SRP0802_BasePassData Render_SRP0802_BasePass(Camera camera, RenderGraph graph, CullingResults cull)
    {
        using (var builder = graph.AddRenderPass <SRP0802_BasePassData>("Base Pass", out var passData, new ProfilingSampler("Base Pass Profiler")))
        {
            //Textures - Multi-RenderTarget
            TextureHandle Albedo = CreateColorTexture(graph, camera, "Albedo");
            passData.m_Albedo = builder.UseColorBuffer(Albedo, 0);
            TextureHandle Emission = CreateColorTexture(graph, camera, "Emission");
            passData.m_Emission = builder.UseColorBuffer(Emission, 1);
            TextureHandle Depth = CreateDepthTexture(graph, camera);
            passData.m_Depth = builder.UseDepthBuffer(Depth, DepthAccess.Write);

            //Renderers
            UnityEngine.Rendering.RendererUtils.RendererListDesc rendererDesc_base_Opaque = new UnityEngine.Rendering.RendererUtils.RendererListDesc(m_PassName1, cull, camera);
            rendererDesc_base_Opaque.sortingCriteria  = SortingCriteria.CommonOpaque;
            rendererDesc_base_Opaque.renderQueueRange = RenderQueueRange.opaque;
            RendererListHandle rHandle_base_Opaque = graph.CreateRendererList(rendererDesc_base_Opaque);
            passData.m_renderList_opaque = builder.UseRendererList(rHandle_base_Opaque);

            UnityEngine.Rendering.RendererUtils.RendererListDesc rendererDesc_base_Transparent = new UnityEngine.Rendering.RendererUtils.RendererListDesc(m_PassName1, cull, camera);
            rendererDesc_base_Transparent.sortingCriteria  = SortingCriteria.CommonTransparent;
            rendererDesc_base_Transparent.renderQueueRange = RenderQueueRange.transparent;
            RendererListHandle rHandle_base_Transparent = graph.CreateRendererList(rendererDesc_base_Transparent);
            passData.m_renderList_transparent = builder.UseRendererList(rHandle_base_Transparent);

            //Builder
            builder.SetRenderFunc((SRP0802_BasePassData data, RenderGraphContext context) =>
            {
                //Skybox - this will draw to the first target, i.e. Albedo
                if (camera.clearFlags == CameraClearFlags.Skybox)
                {
                    context.renderContext.DrawSkybox(camera);
                }

                CoreUtils.DrawRendererList(context.renderContext, context.cmd, data.m_renderList_opaque);
                CoreUtils.DrawRendererList(context.renderContext, context.cmd, data.m_renderList_transparent);
            });

            return(passData);
        }
    }
    protected override void Execute(CustomPassContext ctx)
    {
        PerObjectData renderConfig = PerObjectData.LightProbe | PerObjectData.Lightmaps | PerObjectData.LightProbeProxyVolume;

        if (ctx.hdCamera.frameSettings.IsEnabled(FrameSettingsField.Shadowmask))
        {
            renderConfig |= PerObjectData.OcclusionProbe | PerObjectData.OcclusionProbeProxyVolume | PerObjectData.ShadowMask;
        }

        // We use a different HDRP shader passes for depth prepass (where we write depth + normal) and forward (were we only write color)
        bool isDepthNormal = injectionPoint == CustomPassInjectionPoint.AfterOpaqueDepthAndNormal;
        var  ids           = isDepthNormal ? depthPrepassIds : forwardIds;

        var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(ids, ctx.cullingResults, ctx.hdCamera.camera)
        {
            rendererConfiguration      = renderConfig,
            renderQueueRange           = GetRenderQueueRange(RenderQueueType.AllOpaque),
            sortingCriteria            = SortingCriteria.CommonOpaque,
            excludeObjectMotionVectors = false,
            layerMask = layerMask,
        };

        if (isDepthNormal)
        {
            // Bind normal + depth buffer
            CoreUtils.SetRenderTarget(ctx.cmd, ctx.cameraNormalBuffer, ctx.cameraDepthBuffer, ClearFlag.None);

            // Enable keyword to write normal in the depth pre-pass
            CoreUtils.SetKeyword(ctx.cmd, "WRITE_NORMAL_BUFFER", true);
        }

        // Render all the opaque objects in the layer
        CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result));

        if (isDepthNormal)
        {
            // Reset the keyword to it's default value
            CoreUtils.SetKeyword(ctx.cmd, "WRITE_NORMAL_BUFFER", ctx.hdCamera.frameSettings.litShaderMode == LitShaderMode.Forward);
        }
    }