Altering depth buffer, and extra render passes?

First up - my ultimate goal here is to render some nice portals (similar to valves game “Portal”) - in a fairly optimal manner, using a similar method to the game “Budget Cuts” instead of render targets.

The plan is:

  1. render scene normally (this works)
  2. clear depth buffer, setting to “nearest”, so nothing can be drawn (this does not work - and is main subject of this question)
  3. render portal mesh at maximum depth, punching a hole in the depth buffer to render the portal in (not yet started on this)
  4. render scene again “from the portals point of view” (this also works)

Worth noting, I’ve altered the renderer to optionally skip clearing the screen in its prepass (and indeed skip the clear on my second render pass)

if I just run step (1) and (4) - the results are as I’d expect - the second render still reads the depth buffer from the first, and occludes objects.

My current issue is that if I add a DrawClearQuad between the two renders - there is no change in my result…
However - if I disable the second render (by setting doSecondRendering below to false) I indeed get a clear screen, with the colour passed to DrawClearQuad.

Rendering thread code below:



    QUICK_SCOPE_CYCLE_COUNTER(STAT_RenderPortal);

    FMemMark MemStackMark(FMemStack::Get());

    FDeferredUpdateResource::UpdateResources(RHICmdList);

    //Clear screen
    FIntRect trect(0, 0, 0, 0);
    {
        FRHIRenderPassInfo RPInfo(SceneRenderer->ViewFamily.RenderTarget->GetRenderTargetTexture(), ERenderTargetActions::Load_Store);

        //FRHIRenderPassInfo RPInfo(SceneRenderer->ViewFamily.RenderTarget->GetRenderTargetTexture(), ERenderTargetActions::DontLoad_Store);
        //FRHIRenderPassInfo RPInfo(SceneRenderer->ViewFamily.RenderTarget->GetRenderTargetTexture(), EDepthStencilTargetActions::LoadDepthStencil_StoreDepthStencil);
        //FRHIRenderPassInfo(FRHITexture * DepthRT, EDepthStencilTargetActions DepthActions, FRHITexture * ResolveDepthRT = nullptr, FExclusiveDepthStencil InEDS = FExclusiveDepthStencil::DepthWrite_StencilWrite)

        RHICmdList.BeginRenderPass(RPInfo, TEXT("ClearSceneCaptureContent"));
        pDrawClearQuad(RHICmdList, true, FLinearColor::Blue, true, 0, false, 0, SceneRenderer->ViewFamily.RenderTarget->GetSizeXY(), trect);
        RHICmdList.EndRenderPass();
    }

    //RHICmdList.TransitionResource(EResourceTransitionAccess::EReadable, SceneRenderer->ViewFamily.RenderTarget->GetRenderTargetTexture());
    //FDeferredUpdateResource::UpdateResources(RHICmdList);
    //FlushPendingDeleteRHIResources_RenderThread();

    bool doSecondRendering = true;
    if(doSecondRendering){
        SCOPED_DRAW_EVENT(RHICmdList, RenderScene);
        SceneRenderer->Render(RHICmdList);
    }

    //FlushPendingDeleteRHIResources_RenderThread();
    FSceneRenderer::WaitForTasksClearSnapshotsAndDeleteSceneRenderer(RHICmdList, SceneRenderer);


I’ve left most of my commented out code in to give an idea of what I’ve been attempting.

What I find particularly mysterious is that when I have the second render enabled, the data from the first render is not cleared - feels like I may be missing something fairly fundamental about rendering passes.

Right now, I’d be happy if I could clear/(set to min/max) the depth buffer before the second render.

Could anyone offer any guidance, hints, suggestions or questions?

OK solved - after reading through how the basepass uses DrawClearQuad I’ve altered my FRHIRenderPassInfo to let me alter the depth buffer



        FRHIRenderPassInfo RPInfo(SceneRenderer->ViewFamily.RenderTarget->GetRenderTargetTexture(), ERenderTargetActions::Load_Store);
        RPInfo.DepthStencilRenderTarget.Action = MakeDepthStencilTargetActions(ERenderTargetActions::Clear_Store, ERenderTargetActions::Clear_Store);
        RPInfo.DepthStencilRenderTarget.DepthStencilTarget = FSceneRenderTargets::Get(RHICmdList).GetSceneDepthSurface();
        RPInfo.DepthStencilRenderTarget.ExclusiveDepthStencil = FExclusiveDepthStencil::DepthWrite_StencilWrite;


still quite some way to get everything I want working, but am at least back on track :slight_smile:

Hello! Did you ever make any headway on this/get it working?