public void RenderFrame(DeviceContext context, float timeElapsed, RenderTargetSet targetRT) { ShaderManager.BindSamplerStates(context); RenderTargetSet currentFrameMainBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_FullResAndDepthDescriptor); RenderTargetSet linearDepth = RenderTargetManager.RequestRenderTargetFromPool(m_LinearDepthDescriptor); RenderTargetSet ssaoRT = RenderTargetManager.RequestRenderTargetFromPool(m_SSAODescriptor); if (!m_ShadowsInitialized) { m_ShadowCamera.m_CameraForward = new Vector3(-0.15f, -1.0f, 0.3f); m_ShadowCamera.m_CameraForward.Normalize(); Vector3 min, max; m_SimpleSceneWrapper.GetSceneBounds(out min, out max); Vector3 sceneTop = (min + max) * 0.5f; sceneTop.Y = max.Y; m_ShadowCamera.m_OrthoZoomX = (max.X - min.X) * 0.7f; // some overlap m_ShadowCamera.m_OrthoZoomY = (max.Y - min.Y) * 0.7f; m_ShadowCamera.m_CameraPosition = sceneTop - m_ShadowCamera.m_CameraForward * 50.0f; m_ShadowCamera.m_CameraUp = new Vector3(0, 0, 1); } CalculateAndUpdateConstantBuffer(context); if (!m_ShadowsInitialized) { m_ResolvedShadow = m_ShadowEVSMGenerator.RenderShadows(context, m_SimpleSceneWrapper); m_ShadowsInitialized = true; } if (false) { m_GIRenderer.PartialGIUpdate(context, m_SimpleSceneWrapper, m_ResolvedShadow); } m_CurrentViewportBuffer.Bind(context); using (new GpuProfilePoint(context, "DepthPrepass")) { // set the shaders context.VertexShader.Set(ShaderManager.GetVertexShader("VertexScene")); context.PixelShader.Set(null); currentFrameMainBuffer.Clear(context, new Color4(1.0f, 1.0f, 1.0f, 1.5f), true); currentFrameMainBuffer.BindAsRenderTarget(context, true, false); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthWriteCompare); // render triangles m_SimpleSceneWrapper.RenderNoMaterials(context); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.NoDepth); RenderTargetSet.BindNull(context); } RenderTargetSet motionVectorsSurface = TemporalSurfaceManager.GetRenderTargetCurrent("MotionVectors"); RenderTargetSet motionVectorsSurfacePrevious = TemporalSurfaceManager.GetRenderTargetHistory("MotionVectors"); m_ResolveMotionVectorsPass.ExecutePass(context, motionVectorsSurface, currentFrameMainBuffer); PostEffectHelper.LinearizeDepth(context, linearDepth, currentFrameMainBuffer); m_SSAOPass.ExecutePass(context, ssaoRT, linearDepth, motionVectorsSurface); using (new GpuProfilePoint(context, "MainForwardRender")) { // set the shaders context.VertexShader.Set(ShaderManager.GetVertexShader("VertexScene")); context.PixelShader.Set(ShaderManager.GetPixelShader("PixelScene")); currentFrameMainBuffer.BindAsRenderTarget(context, true); m_ResolvedShadow.BindSRV(context, 0); ssaoRT.BindSRV(context, 1); context.PixelShader.SetShaderResource(m_GIRenderer.m_GIVolumeR.m_ShaderResourceView, 5); context.PixelShader.SetShaderResource(m_GIRenderer.m_GIVolumeG.m_ShaderResourceView, 6); context.PixelShader.SetShaderResource(m_GIRenderer.m_GIVolumeB.m_ShaderResourceView, 7); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthCompare); // render triangles m_SimpleSceneWrapper.Render(context); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.NoDepth); RenderTargetSet.BindNull(context); } using (new GpuProfilePoint(context, "PostEffects")) { RenderTargetSet postEffectSurfacePong = RenderTargetManager.RequestRenderTargetFromPool(m_FullResDescriptor); RenderTargetSet source, dest; source = currentFrameMainBuffer; dest = postEffectSurfacePong; dynamic ppcb = m_PostEffectsConstantBuffer; if (ppcb.dofCoCScale > 0.0f) { m_ScatterDOFPass.ExecutePass(context, dest, currentFrameMainBuffer, currentFrameMainBuffer); PostEffectHelper.Swap(ref source, ref dest); } RenderTargetSet luminanceTexture = m_LuminanceCalculations.ExecutePass(context, source); RenderTargetSet resolvedCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("ResolvedColor"); RenderTargetSet resolvedHistory = TemporalSurfaceManager.GetRenderTargetHistory("ResolvedColor"); m_ResolveHDRPass.ExecutePass(context, resolvedCurrent, source, luminanceTexture); RenderTargetSet resolvedTemporal = RenderTargetManager.RequestRenderTargetFromPool(m_ResolvedColorDescriptor); m_ResolveTemporalPass.ExecutePass(context, resolvedTemporal, resolvedCurrent, resolvedHistory, motionVectorsSurface, motionVectorsSurfacePrevious); m_FxaaPass.ExecutePass(context, targetRT, resolvedTemporal); RenderTargetManager.ReleaseRenderTargetToPool(resolvedTemporal); RenderTargetManager.ReleaseRenderTargetToPool(postEffectSurfacePong); } RenderTargetManager.ReleaseRenderTargetToPool(ssaoRT); RenderTargetManager.ReleaseRenderTargetToPool(linearDepth); RenderTargetManager.ReleaseRenderTargetToPool(currentFrameMainBuffer); }
public RenderTargetSet RenderShadows(DeviceContext context, SimpleSceneWrapper simpleSceneWrapper) { RenderTargetSet.RenderTargetDescriptor evsmDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R32G32B32A32_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = 1024, m_Width = 1024 }; RenderTargetSet EVSMTexture = m_EVSMTexture == null ? RenderTargetManager.RequestRenderTargetFromPool(evsmDescriptor) : m_EVSMTexture; { RenderTargetSet.RenderTargetDescriptor shadowMapDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.Unknown, m_HasDepth = true, m_NumSurfaces = 0, m_Height = 2048, m_Width = 2048 }; RenderTargetSet shadowBuffer = RenderTargetManager.RequestRenderTargetFromPool(shadowMapDescriptor); using (new GpuProfilePoint(context, "Shadowmap")) { // set the shaders context.VertexShader.Set(ShaderManager.GetVertexShader("VertexShadow")); context.PixelShader.Set(null); shadowBuffer.Clear(context, new Color4(), true); shadowBuffer.BindAsRenderTarget(context, true); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthWriteCompare); // render triangles simpleSceneWrapper.RenderNoMaterials(context); RenderTargetSet.BindNull(context); } using (new GpuProfilePoint(context, "EVSM Resolve")) { shadowBuffer.BindDepthAsSRV(context, 0); EVSMTexture.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "ReconstructEVSM"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } RenderTargetSet EVSMTextureTemp = RenderTargetManager.RequestRenderTargetFromPool(evsmDescriptor); using (new GpuProfilePoint(context, "EVSM Blur")) { EVSMTexture.BindSRV(context, 1); EVSMTextureTemp.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "BlurEVSMHorizontal"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); EVSMTextureTemp.BindSRV(context, 1); EVSMTexture.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "BlurEVSMVertical"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } RenderTargetManager.ReleaseRenderTargetToPool(shadowBuffer); RenderTargetManager.ReleaseRenderTargetToPool(EVSMTextureTemp); } m_EVSMTexture = EVSMTexture; return EVSMTexture; }
public RenderTargetSet RenderShadows(DeviceContext context, SimpleSceneWrapper simpleSceneWrapper) { RenderTargetSet.RenderTargetDescriptor evsmDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R32G32B32A32_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = 1024, m_Width = 1024 }; RenderTargetSet EVSMTexture = m_EVSMTexture == null?RenderTargetManager.RequestRenderTargetFromPool(evsmDescriptor) : m_EVSMTexture; { RenderTargetSet.RenderTargetDescriptor shadowMapDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.Unknown, m_HasDepth = true, m_NumSurfaces = 0, m_Height = 2048, m_Width = 2048 }; RenderTargetSet shadowBuffer = RenderTargetManager.RequestRenderTargetFromPool(shadowMapDescriptor); using (new GpuProfilePoint(context, "Shadowmap")) { // set the shaders context.VertexShader.Set(ShaderManager.GetVertexShader("VertexShadow")); context.PixelShader.Set(null); shadowBuffer.Clear(context, new Color4(), true); shadowBuffer.BindAsRenderTarget(context, true); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthWriteCompare); // render triangles simpleSceneWrapper.RenderNoMaterials(context); RenderTargetSet.BindNull(context); } using (new GpuProfilePoint(context, "EVSM Resolve")) { shadowBuffer.BindDepthAsSRV(context, 0); EVSMTexture.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "ReconstructEVSM"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } RenderTargetSet EVSMTextureTemp = RenderTargetManager.RequestRenderTargetFromPool(evsmDescriptor); using (new GpuProfilePoint(context, "EVSM Blur")) { EVSMTexture.BindSRV(context, 1); EVSMTextureTemp.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "BlurEVSMHorizontal"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); EVSMTextureTemp.BindSRV(context, 1); EVSMTexture.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "BlurEVSMVertical"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } RenderTargetManager.ReleaseRenderTargetToPool(shadowBuffer); RenderTargetManager.ReleaseRenderTargetToPool(EVSMTextureTemp); } m_EVSMTexture = EVSMTexture; return(EVSMTexture); }