void Render() { frameAccumulator += _frameDelta; ++frameCount; if (frameAccumulator >= 1.0f) { FramesPerSecond = frameCount / frameAccumulator; frameAccumulator = 0.0f; frameCount = 0; } // Clear targets _device.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1.0f, 0); _device.ClearRenderTargetView(renderView, ambient); _device.ClearRenderTargetView(gBufferLightView, ambient); _device.ClearRenderTargetView(gBufferNormalView, ambient); _device.ClearRenderTargetView(gBufferDiffuseView, ambient); meshFactory.InitInstancedRender(); // Depth map pass if (shadowsEnabled) { _device.ClearDepthStencilView(lightDepthView, DepthStencilClearFlags.Depth, 1.0f, 0); outputMerger.SetDepthStencilState(lightDepthStencilState, 0); outputMerger.SetRenderTargets(0, new RenderTargetView[0], lightDepthView); shadowGenPass.Apply(); OnRender(); effect2.GetVariableByName("lightDepthMap").AsShaderResource().SetResource(lightDepthRes); } // Render pass outputMerger.SetDepthStencilState(depthStencilState, 0); outputMerger.SetRenderTargets(3, gBufferViews, depthView); gBufferGenPass.Apply(); OnRender(); // G-buffer render pass outputMerger.SetDepthStencilState(null, 0); outputMerger.SetRenderTargets(1, renderViews, null); gBufferRenderPass.Apply(); inputAssembler.SetVertexBuffers(0, quadBinding); inputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip; inputAssembler.InputLayout = quadBufferLayout; _device.Draw(4, 0); Info.OnRender(FramesPerSecond); _swapChain.Present(0, PresentFlags.None); }
void Render() { // Clear targets _immediateContext.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1.0f, 0); //_immediateContext.ClearRenderTargetView(renderView, ambient); _immediateContext.ClearRenderTargetView(gBufferLightView, Color4.Black); _immediateContext.ClearRenderTargetView(gBufferNormalView, Color4.Black); _immediateContext.ClearRenderTargetView(gBufferDiffuseView, Color4.Black); // Read collision object transforms, create geometry, etc. _meshFactory.InitInstancedRender(); // Light depth map pass _immediateContext.ClearDepthStencilView(lightDepthView, DepthStencilClearFlags.Depth, 1.0f, 0); if (shadowsEnabled) { outputMerger.SetDepthStencilState(lightDepthStencilState); outputMerger.SetRenderTargets(lightDepthView); shadowGenPass.Apply(_immediateContext); OnRender(); shadowLightDepthBufferVar.SetResource(lightDepthRes); } // Render geometry (colors, normals, depth) to G-buffer outputMerger.SetDepthStencilState(depthState); outputMerger.SetTargets(depthView, gBufferViews); gBufferGenPass.Apply(_immediateContext); OnRender(); /* * if (IsDebugDrawEnabled) * { * debugDrawPass.Apply(_immediateContext); * (PhysicsContext.World.DebugDrawer as PhysicsDebugDraw).DrawDebugWorld(PhysicsContext.World); * } */ // Light accumulation to G-buffer if (deferredLightingEnabled) { outputMerger.SetBlendState(additiveBlendState); // Can't set depthView as render target and shader variable at the same time, // so early HW depth test is not available for light volumes. //outputMerger.SetTargets(depthView, gBufferLightView); outputMerger.SetTargets(gBufferLightView); RenderLights(); } // Render G-buffer outputMerger.SetBlendState(alphaBlendState); outputMerger.SetDepthStencilState(null); if (depthOfFieldEnabled) { outputMerger.SetTargets(gBufferPostProcessView); } else { outputMerger.SetTargets(renderView); } inputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip; lightBufferVar.SetResource(lightBufferRes); normalBufferVar.SetResource(normalBufferRes); diffuseBufferVar.SetResource(diffuseBufferRes); depthMapVar.SetResource(depthBufferRes); //_immediateContext.ClearRenderTargetView(gBufferPostProcessView, Color4.Black); gBufferRenderPass.Apply(_immediateContext); _immediateContext.Draw(3, 0); if (depthOfFieldEnabled) { diffuseBufferVar.SetResource(postProcessBufferRes); outputMerger.SetTargets(gBufferPostProcessViewBlur1); gBufferPostProcessPass.Apply(_immediateContext); _immediateContext.Draw(3, 0); diffuseBufferVar.SetResource(postProcessBufferBlur1Res); outputMerger.SetTargets(gBufferPostProcessViewBlur2); gBufferPostProcessPass.Apply(_immediateContext); _immediateContext.Draw(3, 0); diffuseBufferVar.SetResource(postProcessBufferBlur2Res); outputMerger.SetTargets(gBufferPostProcessViewBlur1); gBufferPostProcessPass.Apply(_immediateContext); _immediateContext.Draw(3, 0); diffuseBufferVar.SetResource(postProcessBufferBlur1Res); outputMerger.SetTargets(gBufferPostProcessViewBlur2); gBufferPostProcessPass.Apply(_immediateContext); _immediateContext.Draw(3, 0); diffuseBufferVar.SetResource(postProcessBufferRes); normalBufferVar.SetResource(postProcessBufferBlur2Res); outputMerger.SetTargets(renderView); gBufferPostProcessPass2.Apply(_immediateContext); _immediateContext.Draw(3, 0); } // Render overlay Info.Render(); outputMerger.SetBlendState(alphaBlendState); diffuseBufferVar.SetResource(Info.OverlayBufferRes); gBufferOverlayPass.Apply(_immediateContext); _immediateContext.Draw(4, 0); _swapChain.Present(0, PresentFlags.None); }