public SSReflectionsEffectPass(SlimDX.Direct3D11.Device device, int resolutionX, int resolutionY) { m_ResultsRTDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R16G16B16A16_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; TemporalSurfaceManager.InitializeRenderTarget("SSReflections", m_ResultsRTDescriptor); }
public void ExecutePass(DeviceContext context, RenderTargetSet target, RenderTargetSet linearDepth, RenderTargetSet motionVectors) { RenderTargetSet ssaoCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("SSAO"); RenderTargetSet ssaoHistory = TemporalSurfaceManager.GetRenderTargetHistory("SSAO"); RenderTargetSet tempBlurBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptor); Random rand = new Random(); dynamic scb = m_SSAOBuffer; scb.g_SSAOPhase = (float)rand.NextDouble() * 3.1415f; m_SSAOBuffer.CompileAndBind(context); using (new GpuProfilePoint(context, "SSAO")) { using (new GpuProfilePoint(context, "SSAOCalculate")) { linearDepth.BindSRV(context, 0); ssaoHistory.BindSRV(context, 1); motionVectors.BindSRV(context, 2); ssaoCurrent.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOCalculate"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } SurfaceDebugManager.RegisterDebug(context, "SSAOMain", ssaoCurrent); using (new GpuProfilePoint(context, "SSAOBlur")) { ssaoCurrent.BindSRV(context, 1); tempBlurBuffer.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurHorizontal"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); SurfaceDebugManager.RegisterDebug(context, "SSAOBlurH", tempBlurBuffer); tempBlurBuffer.BindSRV(context, 1); target.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurVertical"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); SurfaceDebugManager.RegisterDebug(context, "SSAOBlurV", target); } } RenderTargetManager.ReleaseRenderTargetToPool(tempBlurBuffer); }
public SSAOEffectPass(SlimDX.Direct3D11.Device device, int resolutionX, int resolutionY) { m_RTDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R8G8B8A8_UNorm, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; TemporalSurfaceManager.InitializeRenderTarget("SSAO", m_RTDescriptor); m_SSAOBuffer = ShaderManager.CreateConstantBufferInstance("SSAOBuffer", device); }
public void ExecutePass(DeviceContext context, RenderTargetSet linearDepth, RenderTargetSet motionVectors, RenderTargetSet surfaceNormals, RenderTargetSet sourceColor, Camera sceneCam, DepthOperationsPass depthOps) { RenderTargetSet ssrCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("SSReflections"); RenderTargetSet ssrHistory = TemporalSurfaceManager.GetRenderTargetHistory("SSReflections"); RenderTargetSet traceRT = RenderTargetManager.RequestRenderTargetFromPool(m_ResultsRTDescriptor); if (DebugManager.IsFeatureOn("SSReflections")) { using (new GpuProfilePoint(context, "SSReflections")) { using (new GpuProfilePoint(context, "SSReflectionsRaytrace")) { context.PixelShader.SetShaderResource(PostEffectHelper.m_RandomNumbersBuffer.m_ShaderResourceView, 39); linearDepth.BindSRV(context, 0); surfaceNormals.BindSRV(context, 1); sourceColor.BindSRV(context, 2); motionVectors.BindSRV(context, 3); traceRT.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSReflectionsRaytrace"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } using (new GpuProfilePoint(context, "SSReflectionsBlur")) { linearDepth.BindSRV(context, 0); surfaceNormals.BindSRV(context, 1); traceRT.BindSRV(context, 2); motionVectors.BindSRV(context, 3); ssrHistory.BindSRV(context, 4); ssrCurrent.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSReflectionsBlur"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } } } else { traceRT.Clear(context, new Color4(0.0f, 0.0f, 0.0f, 0.0f)); ssrCurrent.Clear(context, new Color4(0.0f, 0.0f, 0.0f, 0.0f)); } DebugManager.RegisterDebug(context, "SSRRaytrace", traceRT); DebugManager.RegisterDebug(context, "SSRBlur", ssrCurrent); RenderTargetManager.ReleaseRenderTargetToPool(traceRT); }
public void Initialize(Device device, Form form, Panel panel, int resolutionX, int resolutionY) { m_ResolutionX = resolutionX; m_ResolutionY = resolutionY; m_FullResDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R16G16B16A16_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_FullResAndDepthDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R16G16B16A16_Float, m_HasDepth = true, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_ResolvedColorDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R8G8B8A8_UNorm, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_LinearDepthDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R32_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_SSAODescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R8_UNorm, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_SimpleSceneWrapper.Initialize(device, "sponza"); TemporalSurfaceManager.InitializeRenderTarget("ResolvedColor", m_ResolvedColorDescriptor); TemporalSurfaceManager.InitializeRenderTarget("MotionVectors", new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R16G16_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }); m_PostEffectsConstantBuffer = ShaderManager.CreateConstantBufferInstance("PostEffects", device); m_ForwardPassBuffer = ShaderManager.CreateConstantBufferInstance("ForwardPassBuffer", device); m_ViewportConstantBuffer = ShaderManager.CreateConstantBufferInstance("GlobalViewportBuffer", device); m_CurrentViewportBuffer = ShaderManager.CreateConstantBufferInstance("CurrentViewport", device); Vector3 min, max; m_SimpleSceneWrapper.GetSceneBounds(out min, out max); m_GIRenderer = new GlobalIlluminationRenderer(device, min, max); // Init passes m_ScatterDOFPass = new ScatterDOFPass(); m_ScatterDOFPass.Initialize(device, resolutionX, resolutionY); m_ResolveHDRPass = new ResolveHDRPass(); m_ResolveMotionVectorsPass = new ResolveMotionVectorsPass(); m_ResolveTemporalPass = new ResolveTemporalMotionBasedPass(); m_FxaaPass = new FxaaPass(); m_SSAOPass = new SSAOEffectPass(device, resolutionX, resolutionY); m_LuminanceCalculations = new LuminanceCalculations(device, resolutionX, resolutionY); m_ShadowEVSMGenerator = new ShadowEVSMGenerator(); m_VolumetricFog = new VolumetricFog(); m_VolumetricFog.Initialize(device); m_StartTime = DateTime.Now; m_ViewportCamera.BindToInput(form, panel); POISSON_SAMPLES = new float[POISSON_SAMPLE_NUM * 2] { 0.655897408497f, 0.95575996511f, 0.944576716895f, 0.455478901428f, 0.203683172197f, 0.0177149729234f, 0.383628747896f, 0.379284571357f, 0.945473563065f, 0.779431977074f, 0.570420562284f, 0.576156483093f, 0.674354533289f, 0.286346887653f, 0.347776132801f, 0.734938485879f, }; }
private void CalculateAndUpdateConstantBuffer(DeviceContext context, double tick) { Matrix previousFrameViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; m_ViewportCamera.TickCamera(tick); dynamic mcb = m_ForwardPassBuffer; dynamic vcb = m_ViewportConstantBuffer; dynamic ppcb = m_PostEffectsConstantBuffer; dynamic cvpb = m_CurrentViewportBuffer; m_ViewportCamera.CalculateMatrices(); m_ShadowCamera.CalculateMatrices(); // Temporal component of matrix Matrix temporalJitter = Matrix.Identity; if (vcb.g_TemporalAA > 0.5f) { //float translationOffset = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 0.5f : -0.5f; //float translationOffsetX = translationOffset; //float translationOffsetY = translationOffset; temporalJitter = Matrix.Translation((POISSON_SAMPLES[(Program.m_FrameNumber) % POISSON_SAMPLE_NUM * 2 + 0] * 2.0f - 1.0f) / (float)m_ResolutionX, (POISSON_SAMPLES[(Program.m_FrameNumber) % POISSON_SAMPLE_NUM * 2 + 1] * 2.0f - 1.0f) / (float)m_ResolutionY, 0.0f); } m_ScatterDOFPass.m_DebugBokeh = ppcb.g_DebugBokeh > 0.5f; Vector3 sceneMin, sceneMax; m_SimpleSceneWrapper.GetSceneBounds(out sceneMin, out sceneMax); vcb.g_ViewProjMatrixPrevFrame = previousFrameViewProjMatrix; cvpb.g_ProjMatrix = m_ViewportCamera.m_ProjectionMatrix; cvpb.g_ViewMatrix = m_ViewportCamera.m_WorldToView; cvpb.g_InvViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; cvpb.g_InvViewProjMatrix.Invert(); cvpb.g_ViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix * temporalJitter; Matrix viewToWorldMatrix = m_ViewportCamera.m_WorldToView; viewToWorldMatrix.Invert(); float projWidth = m_ViewportCamera.m_ProjectionMatrix.M11; float projHeight = m_ViewportCamera.m_ProjectionMatrix.M22; vcb.g_EyeXAxis = Vector4.Transform(new Vector4(1.0f / projWidth, 0, 0, 0), viewToWorldMatrix); vcb.g_EyeYAxis = Vector4.Transform(new Vector4(0, 1.0f / projHeight, 0, 0), viewToWorldMatrix); vcb.g_EyeZAxis = Vector4.Transform(new Vector4(0, 0, 1, 0), viewToWorldMatrix); vcb.g_WorldEyePos = new Vector4(m_ViewportCamera.m_CameraPosition, 1.0f); vcb.g_WorldBoundsMin = new Vector4(sceneMin, 0.0f); vcb.g_WorldBoundsMax = new Vector4(sceneMax, 0.0f); Vector3 invRange = new Vector3(1.0f / (sceneMax.X - sceneMin.X), 1.0f / (sceneMax.Y - sceneMin.Y), 1.0f / (sceneMax.Z - sceneMin.Z)); vcb.g_WorldBoundsInvRange = new Vector4(invRange, 0.0f); vcb.g_zNear = m_ViewportCamera.m_NearZ; vcb.g_zFar = m_ViewportCamera.m_FarZ; vcb.g_FrameJitter = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 1.0f : 0.0f; vcb.g_ScreenSize = new Vector4((float)m_ResolutionX, (float)m_ResolutionY, 1.0f / (float)m_ResolutionX, 1.0f / (float)m_ResolutionY); vcb.g_ScreenSizeHalfRes = new Vector4((float)m_ResolutionX / 2.0f, (float)m_ResolutionY / 2.0f, 2.0f / (float)m_ResolutionX, 2.0f / (float)m_ResolutionY); vcb.g_ReprojectInfo = new Vector4( -2.0f / ((float)m_ResolutionX * m_ViewportCamera.m_ProjectionMatrix.M11), -2.0f / ((float)m_ResolutionY * m_ViewportCamera.m_ProjectionMatrix.M22), (1.0f - m_ViewportCamera.m_ProjectionMatrix.M13) / m_ViewportCamera.m_ProjectionMatrix.M11, (1.0f + m_ViewportCamera.m_ProjectionMatrix.M23) / m_ViewportCamera.m_ProjectionMatrix.M22); vcb.g_ReprojectInfoFromInt = vcb.g_ReprojectInfo + new Vector4(0.0f, 0.0f, vcb.g_ReprojectInfo.X * 0.5f, vcb.g_ReprojectInfo.Y * 0.5f); mcb.g_ShadowViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.g_ShadowInvViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.g_ShadowInvViewProjMatrix.Invert(); mcb.g_LightDir = new Vector4(-m_ShadowCamera.m_CameraForward, 1.0f); mcb.g_LightColor = new Vector4(1.0f, 0.95f, 0.9f, 0.0f); float time = (float)Program.m_Time; mcb.g_LocalPointLightPosition = new Vector4((float)Math.Sin(0.05f * time) * 10.0f, 2.0f, (float)Math.Cos(time * 0.15f) * 5.8f, 0.0f); mcb.g_LocalPointLightColor = new Vector4(1, 0, 0, 0); m_ViewportConstantBuffer.CompileAndBind(context); m_ForwardPassBuffer.CompileAndBind(context); m_CurrentViewportBuffer.CompileAndBind(context); m_PostEffectsConstantBuffer.CompileAndBind(context); }
public void RenderFrame(DeviceContext context, double timeElapsed, RenderTargetSet targetRT) { ShaderManager.BindSamplerStates(context); PerlinNoiseRenderHelper.BindTextures(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.15f); 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.Z - min.Z) * 0.7f; m_ShadowCamera.m_CameraPosition = sceneTop - m_ShadowCamera.m_CameraForward * 50.0f; m_ShadowCamera.m_CameraUp = new Vector3(0, 0, 1); } CalculateAndUpdateConstantBuffer(context, timeElapsed); 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(ShaderManager.GetPixelShader("DepthNormalPrepass")); 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.Render(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); SurfaceDebugManager.RegisterDebug(context, "LinearDepth", linearDepth); m_SSAOPass.ExecutePass(context, ssaoRT, linearDepth, motionVectorsSurface); m_VolumetricFog.RenderVolumetricFog(context, m_ResolvedShadow.m_RenderTargets[0], m_GIRenderer); 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); context.PixelShader.SetShaderResource(m_VolumetricFog.m_ScatteringTexture.m_ShaderResourceView, 8); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthCompare); // render triangles m_SimpleSceneWrapper.Render(context); // render sky PostEffectHelper.RenderFullscreenTriangle(context, "Sky", true); 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.g_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, true); SurfaceDebugManager.RegisterDebug(context, "ResolvedNoFXAA", resolvedTemporal); m_FxaaPass.ExecutePass(context, targetRT, resolvedTemporal); RenderTargetManager.ReleaseRenderTargetToPool(resolvedTemporal); RenderTargetManager.ReleaseRenderTargetToPool(postEffectSurfacePong); } RenderTargetManager.ReleaseRenderTargetToPool(ssaoRT); RenderTargetManager.ReleaseRenderTargetToPool(linearDepth); RenderTargetManager.ReleaseRenderTargetToPool(currentFrameMainBuffer); }
public void ExecutePass(DeviceContext context, RenderTargetSet target, RenderTargetSet linearDepth, RenderTargetSet motionVectors, RenderTargetSet surfaceNormals, DepthOperationsPass depthOps) { RenderTargetSet ssaoCurrent = TemporalSurfaceManager.GetRenderTargetCurrent("SSAO"); RenderTargetSet ssaoHistory = TemporalSurfaceManager.GetRenderTargetHistory("SSAO"); if (DebugManager.IsFeatureOn("SSAO")) { RenderTargetSet tempBlurBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_RTDescriptor); Random rand = new Random(); dynamic scb = m_SSAOBuffer; scb.g_SSAOPhase = (float)rand.NextDouble() * 3.1415f; m_SSAOBuffer.CompileAndBind(context); using (new GpuProfilePoint(context, "SSAO")) { using (new GpuProfilePoint(context, "SSAOCalculate")) { linearDepth.BindSRV(context, 0); ssaoHistory.BindSRV(context, 1); motionVectors.BindSRV(context, 2); surfaceNormals.BindSRV(context, 3); ssaoCurrent.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOCalculate"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); } DebugManager.RegisterDebug(context, "SSAOMain", ssaoCurrent); using (new GpuProfilePoint(context, "SSAOBlur")) { ssaoCurrent.BindSRV(context, 1); tempBlurBuffer.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurHorizontal"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); DebugManager.RegisterDebug(context, "SSAOBlurH", tempBlurBuffer); tempBlurBuffer.BindSRV(context, 1); target.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "SSAOBlurVertical"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); DebugManager.RegisterDebug(context, "SSAOBlurV", target); } } RenderTargetManager.ReleaseRenderTargetToPool(tempBlurBuffer); } else { target.Clear(context, new SlimDX.Color4(1.0f, 1.0f, 1.0f, 1.0f)); } if (DebugManager.IsDebugging("UpsampledSSAO")) { RenderTargetSet tempFullResBuffer = RenderTargetManager.RequestRenderTargetFromPool(m_UpsampleDebugRTDescriptor); target.BindSRV(context, 0); depthOps.m_BilateralUpsampleOffsets.BindSRV(context, 10); tempFullResBuffer.BindAsRenderTarget(context); PostEffectHelper.RenderFullscreenTriangle(context, "BilateralUpsample"); RenderTargetSet.BindNull(context); ContextHelper.ClearSRVs(context); DebugManager.RegisterDebug(context, "UpsampledSSAO", tempFullResBuffer); RenderTargetManager.ReleaseRenderTargetToPool(tempFullResBuffer); } }
static void Main() { m_FrameNumber = 0; m_Time = 0.0f; Device device; SwapChain swapChain; //var form = new RenderForm("CSharpRenderer"); var form = new CSharpRendererMainForm(); var panel = form.GetRenderingPanel(); form.ClientSize = new System.Drawing.Size(ResolutionX, ResolutionY); var description = new SwapChainDescription() { BufferCount = 2, Usage = Usage.RenderTargetOutput, OutputHandle = panel.Handle, IsWindowed = true, ModeDescription = new ModeDescription(ResolutionX, ResolutionY, new Rational(60, 1), Format.R8G8B8A8_UNorm), SampleDescription = new SampleDescription(1, 0), Flags = SwapChainFlags.AllowModeSwitch, SwapEffect = SwapEffect.Discard }; Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, description, out device, out swapChain); var swapChainResource = Resource.FromSwapChain <Texture2D>(swapChain, 0); SamplerStates.Initialize(device); ShaderManager.Initialize(device); GPUProfiler.Initialize(device); ContextHelper.Initialize(device); RenderTargetManager.Initialize(device); PostEffectHelper.Initialize(device, ResolutionX, ResolutionY); CubemapRenderHelper.Initialize(device); PerlinNoiseRenderHelper.Initialize(device, device.ImmediateContext); LightingLUTHelper.Initialize(device, device.ImmediateContext); DebugManager.Initialize(device, ResolutionX, ResolutionY); InitializeControls(form); Scene scene = new Scene(); scene.Initialize(device, form, panel, ResolutionX, ResolutionY); var resolvedRenderTarget = RenderTargetSet.CreateRenderTargetSet(device, ResolutionX, ResolutionY, Format.R8G8B8A8_UNorm, 1, false); RenderTargetSet.BindNull(device.ImmediateContext); // setting a viewport is required if you want to actually see anything var context = device.ImmediateContext; // prevent DXGI handling of alt+enter, which doesn't work properly with Winforms using (var factory = swapChain.GetParent <Factory>()) factory.SetWindowAssociation(panel.Handle, WindowAssociationFlags.IgnoreAltEnter); int counter = 0; Dictionary <string, double> profilers; profilers = new Dictionary <String, double>(); DateTime now = DateTime.Now; CustomConstantBufferInstance globalFrameConstantBuffer = ShaderManager.CreateConstantBufferInstance("GlobalFrameBuffer", device); MessagePump.Run(form, () => { TemporalSurfaceManager.UpdateTemporalSurfaces(); if (ShaderManager.UpdateShaderManager(device)) { InitializeControls(form); } GPUProfiler.BeginFrameProfiling(context); double timeDelta = (DateTime.Now - now).TotalMilliseconds; if (!form.GetFreezeTime()) { m_Time += timeDelta / 1000.0; m_FrameNumber++; } UpdateGlobalConstantBuffer(context, globalFrameConstantBuffer, form); scene.RenderFrame(context, timeDelta, resolvedRenderTarget); now = DateTime.Now; DebugManager.PresentDebug(context, resolvedRenderTarget); context.CopyResource(resolvedRenderTarget.m_RenderTargets[0].m_TextureObject2D, swapChainResource); GPUProfiler.EndFrameProfiling(context); swapChain.Present(0, PresentFlags.None); context.PixelShader.SetShaderResource(null, 0); if (GPUProfiler.m_CurrentFrameProfilerTree != null) { Action <GPUProfiler.ProfilerTreeMember, String> processLevel = null; processLevel = (GPUProfiler.ProfilerTreeMember treeMember, String level) => { string finalName = level + treeMember.m_Name; if (profilers.ContainsKey(finalName)) { profilers[finalName] += treeMember.m_Time; } else { profilers.Add(finalName, treeMember.m_Time); } foreach (var v in treeMember.m_ChildMembers) { processLevel(v, level + "_"); } }; processLevel(GPUProfiler.m_CurrentFrameProfilerTree, ""); } CheckAndUpdateDebugUI(context, form); if (++counter == 10) { UpdateControls(); DataGridView dataGridView = form.GetDataGridView(); dataGridView.Rows.Clear(); foreach (var profilerEntry in profilers) { DataGridViewRow row = new DataGridViewRow(); row.CreateCells(dataGridView); row.Cells[0].Value = profilerEntry.Key; row.Cells[1].Value = String.Format("{0}", Math.Round(profilerEntry.Value * 100.0 / 10.0) / 100.0); dataGridView.Rows.Add(row); } profilers.Clear(); counter = 0; } else { // avoid 2ms frame times... System.Threading.Thread.Sleep(10); } }); }
public void Initialize(Device device, Form form, Panel panel, int resolutionX, int resolutionY) { m_ResolutionX = resolutionX; m_ResolutionY = resolutionY; m_FullResDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R16G16B16A16_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_FullResAndDepthDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R16G16B16A16_Float, m_HasDepth = true, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_ResolvedColorDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R8G8B8A8_UNorm, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_LinearDepthDescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R32_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_SSAODescriptor = new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R8_UNorm, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }; m_SimpleSceneWrapper.Initialize(device, "sponza"); TemporalSurfaceManager.InitializeRenderTarget("ResolvedColor", m_ResolvedColorDescriptor); TemporalSurfaceManager.InitializeRenderTarget("MotionVectors", new RenderTargetSet.RenderTargetDescriptor() { m_Format = Format.R16G16_Float, m_HasDepth = false, m_NumSurfaces = 1, m_Height = resolutionY, m_Width = resolutionX }); m_PostEffectsConstantBuffer = ShaderManager.CreateConstantBufferInstance("PostEffects", device); m_ForwardPassBuffer = ShaderManager.CreateConstantBufferInstance("ForwardPassBuffer", device); m_ViewportConstantBuffer = ShaderManager.CreateConstantBufferInstance("GlobalViewportBuffer", device); m_CurrentViewportBuffer = ShaderManager.CreateConstantBufferInstance("CurrentViewport", device); Vector3 min, max; m_SimpleSceneWrapper.GetSceneBounds(out min, out max); m_GIRenderer = new GlobalIlluminationRenderer(device, min, max); // Init passes m_ScatterDOFPass = new ScatterDOFPass(); m_ScatterDOFPass.Initialize(device, resolutionX, resolutionY); m_ResolveHDRPass = new ResolveHDRPass(); m_ResolveMotionVectorsPass = new ResolveMotionVectorsPass(); m_ResolveTemporalPass = new ResolveTemporalMotionBasedPass(); m_FxaaPass = new FxaaPass(); m_SSAOPass = new SSAOEffectPass(device, resolutionX, resolutionY); m_LuminanceCalculations = new LuminanceCalculations(device, resolutionX, resolutionY); m_ShadowEVSMGenerator = new ShadowEVSMGenerator(); m_ViewportCamera.BindToInput(form, panel); }
private void CalculateAndUpdateConstantBuffer(DeviceContext context) { Matrix previousFrameViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; m_ViewportCamera.TickCamera(0.1f); dynamic mcb = m_ForwardPassBuffer; dynamic vcb = m_ViewportConstantBuffer; dynamic ppcb = m_PostEffectsConstantBuffer; dynamic cvpb = m_CurrentViewportBuffer; m_ViewportCamera.CalculateMatrices(); m_ShadowCamera.CalculateMatrices(); // Temporal component of matrix Matrix temporalJitter = Matrix.Identity; if (vcb.temporalAA > 0.5f) { System.Random rand = new System.Random(); float translationOffset = (TemporalSurfaceManager.GetCurrentPhase("ResolvedColor") == 0) ? 0.5f : -0.5f; float translationOffsetX = translationOffset; float translationOffsetY = translationOffset; temporalJitter = Matrix.Translation(translationOffsetX / (float)m_ResolutionX, translationOffsetY / (float)m_ResolutionY, 0.0f); } m_ScatterDOFPass.m_DebugBokeh = ppcb.debugBokeh > 0.5f; Vector3 sceneMin, sceneMax; m_SimpleSceneWrapper.GetSceneBounds(out sceneMin, out sceneMax); vcb.viewProjMatrixPrevFrame = previousFrameViewProjMatrix; cvpb.projMatrix = m_ViewportCamera.m_ProjectionMatrix; cvpb.viewMatrix = m_ViewportCamera.m_WorldToView; cvpb.invViewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix; cvpb.invViewProjMatrix.Invert(); cvpb.viewProjMatrix = m_ViewportCamera.m_ViewProjectionMatrix * temporalJitter; vcb.worldEyePos = new Vector4(m_ViewportCamera.m_CameraPosition, 1.0f); vcb.worldBoundsMin = new Vector4(sceneMin, 0.0f); vcb.worldBoundsMax = new Vector4(sceneMax, 0.0f); Vector3 invRange = new Vector3(1.0f / (sceneMax.X - sceneMin.X), 1.0f / (sceneMax.Y - sceneMin.Y), 1.0f / (sceneMax.Z - sceneMin.Z)); vcb.worldBoundsInvRange = new Vector4(invRange, 0.0f); vcb.zNear = m_ViewportCamera.m_NearZ; vcb.zFar = m_ViewportCamera.m_FarZ; vcb.screenSize = new Vector4((float)m_ResolutionX, (float)m_ResolutionY, 1.0f / (float)m_ResolutionX, 1.0f / (float)m_ResolutionY); vcb.screenSizeHalfRes = new Vector4((float)m_ResolutionX / 2.0f, (float)m_ResolutionY / 2.0f, 2.0f / (float)m_ResolutionX, 2.0f / (float)m_ResolutionY); vcb.reprojectInfo = new Vector4( -2.0f / ((float)m_ResolutionX * m_ViewportCamera.m_ProjectionMatrix.M11), -2.0f / ((float)m_ResolutionY * m_ViewportCamera.m_ProjectionMatrix.M22), (1.0f - m_ViewportCamera.m_ProjectionMatrix.M13) / m_ViewportCamera.m_ProjectionMatrix.M11, (1.0f + m_ViewportCamera.m_ProjectionMatrix.M23) / m_ViewportCamera.m_ProjectionMatrix.M22); vcb.reprojectInfoFromInt = vcb.reprojectInfo + new Vector4(0.0f, 0.0f, vcb.reprojectInfo.X * 0.5f, vcb.reprojectInfo.Y * 0.5f); mcb.shadowViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.shadowInvViewProjMatrix = m_ShadowCamera.m_ViewProjectionMatrix; mcb.shadowInvViewProjMatrix.Invert(); mcb.lightDir = new Vector4(-m_ShadowCamera.m_CameraForward, 1.0f); m_ViewportConstantBuffer.CompileAndBind(context); m_ForwardPassBuffer.CompileAndBind(context); m_CurrentViewportBuffer.CompileAndBind(context); m_PostEffectsConstantBuffer.CompileAndBind(context); }
public void RenderFrame(DeviceContext context, double timeElapsed, RenderTargetSet targetRT) { ShaderManager.BindSamplerStates(context); PerlinNoiseRenderHelper.BindTextures(context); RenderTargetSet currentFrameMainBuffer = TemporalSurfaceManager.GetRenderTargetCurrent("SceneMainRender"); RenderTargetSet ssaoRT = RenderTargetManager.RequestRenderTargetFromPool(m_SSAODescriptor); bool useTemporal = !DebugManager.m_DisabledTemporal; if (!m_ShadowsInitialized) { InitializeShadowmapAndCubemaps(context, timeElapsed); } CalculateAndUpdateConstantBuffer(context, timeElapsed); 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(ShaderManager.GetPixelShader("DepthNormalPrepass")); currentFrameMainBuffer.Clear(context, new Color4(1.0f, 1.0f, 1.0f, 1.5f), true); currentFrameMainBuffer.BindAsRenderTarget(context, true, true); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthWriteCompare); // render triangles m_SimpleSceneWrapper.Render(context); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.NoDepth); RenderTargetSet.BindNull(context); DebugManager.RegisterDebug(context, "NormalsPrepass", currentFrameMainBuffer); } RenderTargetSet motionVectorsSurface = TemporalSurfaceManager.GetRenderTargetCurrent("MotionVectors"); RenderTargetSet motionVectorsSurfacePrevious = TemporalSurfaceManager.GetRenderTargetHistory("MotionVectors"); m_ResolveMotionVectorsPass.ExecutePass(context, motionVectorsSurface, currentFrameMainBuffer); DebugManager.RegisterDebug(context, "MotionVectors", motionVectorsSurface); m_DepthOperationsPass.ExecutePass(context, currentFrameMainBuffer); RenderTargetSet linearDepth = m_DepthOperationsPass.m_LinearDepth; m_SSAOPass.ExecutePass(context, ssaoRT, m_DepthOperationsPass.m_HalfLinearDepth, motionVectorsSurface, m_DepthOperationsPass.m_HalfNormals, m_DepthOperationsPass); m_SSReflectionsPass.ExecutePass(context, m_DepthOperationsPass.m_HalfLinearDepth, motionVectorsSurface, m_DepthOperationsPass.m_HalfNormals, TemporalSurfaceManager.GetRenderTargetHistory("SceneMainRender"), m_ViewportCamera, m_DepthOperationsPass); m_VolumetricFog.RenderVolumetricFog(context, m_ResolvedShadow.m_RenderTargets[0], m_GIRenderer); 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); TemporalSurfaceManager.GetRenderTargetCurrent("SSReflections").BindSRV(context, 2); m_DepthOperationsPass.m_BilateralUpsampleOffsets.BindSRV(context, 10); 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); context.PixelShader.SetShaderResource(m_VolumetricFog.m_ScatteringTexture.m_ShaderResourceView, 8); context.PixelShader.SetShaderResource(m_CubeObjectFiltered.m_ShaderResourceView, 11); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.DepthCompare); LightingLUTHelper.BindTextures(context); // render triangles m_SimpleSceneWrapper.Render(context); // render sky PostEffectHelper.RenderFullscreenTriangle(context, "Sky", true); ContextHelper.SetDepthStencilState(context, ContextHelper.DepthConfigurationType.NoDepth); RenderTargetSet.BindNull(context); } RenderTargetManager.ReleaseRenderTargetToPool(ssaoRT); using (new GpuProfilePoint(context, "PostEffects")) { RenderTargetSet postEffectSurfacePong = RenderTargetManager.RequestRenderTargetFromPool(m_FullResDescriptor); RenderTargetSet source, dest; source = currentFrameMainBuffer; dest = postEffectSurfacePong; dynamic ppcb = m_PostEffectsConstantBuffer; if (ppcb.g_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); DebugManager.RegisterDebug(context, "ResolvedNoTemporal", resolvedCurrent); RenderTargetSet resolvedTemporal = RenderTargetManager.RequestRenderTargetFromPool(m_ResolvedColorDescriptor); RenderTargetSet finalResolvedTarget = resolvedCurrent; if (useTemporal) { m_ResolveTemporalPass.ExecutePass(context, resolvedTemporal, resolvedCurrent, resolvedHistory, motionVectorsSurface, motionVectorsSurfacePrevious, true); finalResolvedTarget = resolvedTemporal; } DebugManager.RegisterDebug(context, "ResolvedNoFXAA", finalResolvedTarget); m_FxaaPass.ExecutePass(context, targetRT, finalResolvedTarget); RenderTargetManager.ReleaseRenderTargetToPool(resolvedTemporal); RenderTargetManager.ReleaseRenderTargetToPool(postEffectSurfacePong); } }
static void Main() { Device device; SwapChain swapChain; //var form = new RenderForm("CSharpRenderer"); var form = new CSharpRendererMainForm(); var panel = form.GetRenderingPanel(); form.ClientSize = new System.Drawing.Size(ResolutionX, ResolutionY); var description = new SwapChainDescription() { BufferCount = 2, Usage = Usage.RenderTargetOutput, OutputHandle = panel.Handle, IsWindowed = true, ModeDescription = new ModeDescription(ResolutionX, ResolutionY, new Rational(60, 1), Format.R8G8B8A8_UNorm), SampleDescription = new SampleDescription(1, 0), Flags = SwapChainFlags.AllowModeSwitch, SwapEffect = SwapEffect.Discard }; Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, description, out device, out swapChain); var swapChainResource = Resource.FromSwapChain <Texture2D>(swapChain, 0); SamplerStates.Initialize(device); ShaderManager.Initialize(device); GPUProfiler.Initialize(device); ContextHelper.Initialize(device); RenderTargetManager.Initialize(device); PostEffectHelper.Initialize(device, ResolutionX, ResolutionY); CubemapRenderHelper.Initialize(device); Dictionary <CustomConstantBufferDefinition.ConstantBufferPropertyField, Tuple <TrackBar, TextBox> > propertyControlBindings = new Dictionary <CustomConstantBufferDefinition.ConstantBufferPropertyField, Tuple <TrackBar, TextBox> >(); { TableLayoutPanel tableLayout = form.GetTableLayoutPanel(); var contantBuffers = ShaderManager.GetConstantBufferDefinitions(); int tableParamCounter = 1; foreach (var cb in contantBuffers) { var paramProperties = cb.GetParamProperties(); if (paramProperties.Count > 0) { Label groupLabel = new Label(); groupLabel.Text = cb.m_Name; groupLabel.BorderStyle = BorderStyle.FixedSingle; groupLabel.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; tableLayout.Controls.Add(groupLabel, 0, tableParamCounter); tableParamCounter++; foreach (var param in paramProperties) { Label lb = new Label(); lb.Text = param.name; lb.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; TextBox text = new TextBox(); TrackBar tb = new TrackBar(); tb.Size = new System.Drawing.Size(400, 10); tb.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; tb.Minimum = 0; tb.Maximum = 1024; tb.Value = (int)(((Single)param.paramValue - param.paramRangeMin) / (param.paramRangeMax - param.paramRangeMin) * 1024); text.Text = ((Single)param.paramValue).ToString(); text.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom; tableLayout.Controls.Add(lb, 0, tableParamCounter); tableLayout.Controls.Add(tb, 1, tableParamCounter); tableLayout.Controls.Add(text, 2, tableParamCounter); propertyControlBindings.Add(param, new Tuple <TrackBar, TextBox>(tb, text)); tableParamCounter++; } } } } Scene scene = new Scene(); scene.Initialize(device, form, panel, ResolutionX, ResolutionY); var resolvedRenderTarget = RenderTargetSet.CreateRenderTargetSet(device, ResolutionX, ResolutionY, Format.R8G8B8A8_UNorm, 1, false); RenderTargetSet.BindNull(device.ImmediateContext); // setting a viewport is required if you want to actually see anything var context = device.ImmediateContext; // prevent DXGI handling of alt+enter, which doesn't work properly with Winforms using (var factory = swapChain.GetParent <Factory>()) factory.SetWindowAssociation(panel.Handle, WindowAssociationFlags.IgnoreAltEnter); int counter = 0; Dictionary <string, double> profilers; profilers = new Dictionary <String, double>(); MessagePump.Run(form, () => { TemporalSurfaceManager.UpdateTemporalSurfaces(); ShaderManager.UpdateShaderManager(device); GPUProfiler.BeginFrameProfiling(context); scene.RenderFrame(context, 0.0f, resolvedRenderTarget); context.CopyResource(resolvedRenderTarget.m_RenderTargets[0].m_TextureObject2D, swapChainResource); GPUProfiler.EndFrameProfiling(context); swapChain.Present(0, PresentFlags.None); context.PixelShader.SetShaderResource(null, 0); if (GPUProfiler.m_CurrentFrameProfilerTree != null) { Action <GPUProfiler.ProfilerTreeMember, String> processLevel = null; processLevel = (GPUProfiler.ProfilerTreeMember treeMember, String level) => { string finalName = level + treeMember.m_Name; if (profilers.ContainsKey(finalName)) { profilers[finalName] += treeMember.m_Time; } else { profilers.Add(finalName, treeMember.m_Time); } foreach (var v in treeMember.m_ChildMembers) { processLevel(v, level + "_"); } }; processLevel(GPUProfiler.m_CurrentFrameProfilerTree, ""); } if (++counter == 10) { foreach (var propertyBinding in propertyControlBindings) { var property = propertyBinding.Key; var trackBar = propertyBinding.Value.Item1; var textBox = propertyBinding.Value.Item2; float rawVal = (float)trackBar.Value / 1024.0f; if (property.isGamma) { rawVal = (float)Math.Pow((double)rawVal, 2.2); } float val = rawVal * (property.paramRangeMax - property.paramRangeMin) + property.paramRangeMin; property.paramValue = val; textBox.Text = val.ToString("F"); } DataGridView dataGridView = form.GetDataGridView(); dataGridView.Rows.Clear(); foreach (var profilerEntry in profilers) { DataGridViewRow row = new DataGridViewRow(); row.CreateCells(dataGridView); row.Cells[0].Value = profilerEntry.Key; row.Cells[1].Value = String.Format("{0}", Math.Round(profilerEntry.Value * 100.0 / 10.0) / 100.0); dataGridView.Rows.Add(row); } profilers.Clear(); counter = 0; } System.Threading.Thread.Sleep(15); }); }