internal static void AddPointBillboard(string material, Color color, Vector3D origin, float radius, float angle, int priority = 0, int customViewProjection = -1) { if (!MyRender11.DebugOverrides.BillboardsDynamic) { return; } Debug.Assert(material != null); origin.AssertIsValid(); angle.AssertIsValid(); MyQuadD quad; if (MyUtils.GetBillboardQuadAdvancedRotated(out quad, origin, radius, angle, MyRender11.Environment.Matrices.CameraPosition) != false) { MyBillboard billboard = MyBillboardRenderer.AddBillboardOnce(); if (billboard == null) { return; } billboard.Priority = priority; billboard.CustomViewProjection = customViewProjection; CreateBillboard(billboard, ref quad, material, ref color, ref origin); } }
internal static void OnDeviceReset() { MyHwBuffers.OnDeviceReset(); MyShaders.OnDeviceReset(); MyMaterialShaders.OnDeviceReset(); MyPipelineStates.OnDeviceReset(); MyTextures.OnDeviceReset(); MyRwTextures.OnDeviceReset(); MyTransparentRendering.OnDeviceReset(); ResetShadows(Settings.ShadowCascadeCount, RenderSettings.ShadowQuality.ShadowCascadeResolution()); MyBillboardRenderer.OnDeviceRestart(); MyScreenDecals.OnDeviceReset(); MyMeshMaterials1.InvalidateMaterials(); MyVoxelMaterials1.InvalidateMaterials(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory <MyFoliageComponent> .GetAll()) { f.Dispose(); } foreach (var c in MyComponentFactory <MyGroupRootComponent> .GetAll()) { c.OnDeviceReset(); } MyBigMeshTable.Table.OnDeviceReset(); MySceneMaterials.OnDeviceReset(); MyMeshes.OnDeviceReset(); MyInstancing.OnDeviceReset(); MyScreenDecals.OnDeviceReset(); }
internal static void AddBillboardOriented(string material, Color color, Vector3D origin, Vector3 leftVector, Vector3 upVector, float radius, int priority = 0, float softParticleDistanceScale = 1.0f, int customViewProjection = -1) { if (!MyRender11.DebugOverrides.BillboardsDynamic) { return; } Debug.Assert(material != null); origin.AssertIsValid(); leftVector.AssertIsValid(); upVector.AssertIsValid(); radius.AssertIsValid(); MyDebug.AssertDebug(radius > 0); MyBillboard billboard = MyBillboardRenderer.AddBillboardOnce(); if (billboard == null) { return; } billboard.Priority = priority; billboard.CustomViewProjection = customViewProjection; MyQuadD quad; MyUtils.GetBillboardQuadOriented(out quad, ref origin, radius, ref leftVector, ref upVector); CreateBillboard(billboard, ref quad, material, ref color, ref origin, softParticleDistanceScale); }
internal static void OnDeviceReset() { MyHwBuffers.OnDeviceReset(); MyShaders.OnDeviceReset(); MyMaterialShaders.OnDeviceReset(); MyPipelineStates.OnDeviceReset(); MyTextures.OnDeviceReset(); MyRwTextures.OnDeviceEnd(); MyShadows.OnDeviceReset(); MyBillboardRenderer.OnDeviceRestart(); MyMeshMaterials1.InvalidateMaterials(); MyVoxelMaterials1.InvalidateMaterials(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory <MyFoliageComponent> .GetAll()) { f.Dispose(); } foreach (var c in MyComponentFactory <MyGroupRootComponent> .GetAll()) { c.OnDeviceReset(); } MyBigMeshTable.Table.OnDeviceReset(); MySceneMaterials.OnDeviceReset(); MyMeshes.OnDeviceReset(); MyInstancing.OnDeviceReset(); }
private static void OnDeviceReset() { MyManagers.OnDeviceReset(); MyShaders.OnDeviceReset(); MyMaterialShaders.OnDeviceReset(); MyTransparentRendering.OnDeviceReset(); ResetShadows(MyShadowCascades.Settings.NewData.CascadesCount, Settings.User.ShadowQuality.ShadowCascadeResolution()); MyBillboardRenderer.OnDeviceReset(); MyScreenDecals.OnDeviceReset(); MyMeshMaterials1.OnDeviceReset(); MyVoxelMaterials1.OnDeviceReset(); MyRenderableComponent.MarkAllDirty(); foreach (var f in MyComponentFactory <MyFoliageComponent> .GetAll()) { f.Dispose(); } foreach (var c in MyComponentFactory <MyGroupRootComponent> .GetAll()) { c.OnDeviceReset(); } MyBigMeshTable.Table.OnDeviceReset(); MySceneMaterials.OnDeviceReset(); MyMeshes.OnDeviceReset(); MyInstancing.OnDeviceReset(); MyScreenDecals.OnDeviceReset(); }
private static void UpdateSceneFrame() { MySimpleProfiler.Begin("Textures"); ProfilerShort.Begin("LoadMeshes"); MyMeshes.Load(); ProfilerShort.End(); ProfilerShort.Begin("QueryTexturesFromEntities"); QueryTexturesFromEntities(); ProfilerShort.End(); ProfilerShort.Begin("MyTextures.Load"); MyManagers.FileTextures.LoadAllRequested(); ProfilerShort.End(); ProfilerShort.Begin("GatherTextures"); GatherTextures(); ProfilerShort.End(); MySimpleProfiler.End("Textures"); MyBillboardRenderer.OnFrameStart(); UpdateActors(); MyBigMeshTable.Table.MoveToGPU(); ProfilerShort.Begin("Update merged groups"); ProfilerShort.Begin("UpdateBeforeDraw"); foreach (var r in MyComponentFactory <MyGroupRootComponent> .GetAll()) { r.UpdateBeforeDraw(); } ProfilerShort.End(); ProfilerShort.Begin("MoveToGPU"); foreach (var r in MyComponentFactory <MyGroupRootComponent> .GetAll()) { foreach (var val in r.m_materialGroups.Values) { // optimize: keep list+set for updating val.MoveToGPU(); } } ProfilerShort.End(); ProfilerShort.End(); ProfilerShort.Begin("Fill foliage streams"); MyGpuProfiler.IC_BeginBlock("Fill foliage streams"); m_foliageGenerator.PerFrame(); m_foliageGenerator.Begin(); MyFoliageComponents.Update(); m_foliageGenerator.End(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); MyCommon.MoveToNextFrame(); }
internal static unsafe void InitSubsystems() { InitializeBlendStates(); InitializeRasterizerStates(); InitilizeSamplerStates(); MyCommon.Init(); MyPipelineStates.Init(); MyTextures.Init(); MyVertexLayouts.Init(); MyShaders.Init(); MyRwTextures.Init(); MyHwBuffers.Init(); MyMeshes.Init(); MyMeshTableSRV.Init(); MyMergeInstancing.Init(); MyGeometryRenderer.Init(); MyLightRendering.Init(); MyShadows.Init(); MyLinesRenderer.Init(); MySpritesRenderer.Init(); MyPrimitivesRenderer.Init(); MyFoliageRenderer.Init(); MyOutline.Init(); MyComponents.Init(); MyBillboardRenderer.Init(); // hardcoded limits MyDebugRenderer.Init(); MyGPUFoliageGenerating.Init(); MyScreenDecals.Init(); MyEnvProbeProcessing.Init(); MyShadowsResolve.Init(); MyAtmosphereRenderer.Init(); MyAAEdgeMarking.Init(); MyScreenPass.Init(); MyCopyToRT.Init(); MyBlendTargets.Init(); MyFXAA.Init(); MyDepthResolve.Init(); MyBloom.Init(); MyLuminanceAverage.Init(); MyToneMapping.Init(); MySSAO.Init(); MyHdrDebugTools.Init(); MySceneMaterials.Init(); MyMaterials1.Init(); MyVoxelMaterials1.Init(); MyMeshMaterials1.Init(); //MyShaderFactory.RunCompilation(); // rebuild }
internal static unsafe void InitSubsystems() { MyRwTextures.Init(); MyHwBuffers.Init(); MyPipelineStates.Init(); ResetShadows(MyRenderProxy.Settings.ShadowCascadeCount, RenderSettings.ShadowQuality.ShadowCascadeResolution()); MyRender11.Init(); MyCommon.Init(); SamplerStates.Init(); MyDepthStencilState.Init(); MyTextures.Init(); MyVertexLayouts.Init(); MyShaders.Init(); MyMeshes.Init(); MyMeshTableSRV.Init(); MyLightRendering.Init(); MyLinesRenderer.Init(); MySpritesRenderer.Init(); MyPrimitivesRenderer.Init(); MyOutline.Init(); MyBlur.Init(); MyTransparentRendering.Init(); MyFoliageComponents.Init(); MyBillboardRenderer.Init(); // hardcoded limits MyDebugRenderer.Init(); MyScreenDecals.Init(); MyEnvProbeProcessing.Init(); MyAtmosphereRenderer.Init(); MyCloudRenderer.Init(); MyAAEdgeMarking.Init(); MyScreenPass.Init(); MyCopyToRT.Init(); MyBlendTargets.Init(); MyFXAA.Init(); MyDepthResolve.Init(); MyBloom.Init(); MyLuminanceAverage.Init(); MyToneMapping.Init(); MySSAO.Init(); MyPlanetBlur.Init(); MyHdrDebugTools.Init(); MySceneMaterials.Init(); MyMaterials1.Init(); MyVoxelMaterials1.Init(); MyMeshMaterials1.Init(); }
private static void OnSessionEnd() { MyManagers.OnUnloadData(); MyActorFactory.RemoveAll(); // many-to-one relation, can live withput owners, deallocated separately // MyComponentFactory<MyInstancingComponent>.RemoveAll(); //MyVoxelMesh.RemoveAll(); //MyDynamicMesh.RemoveAll(); MyRender11.Log.WriteLine("Unloading session data"); // Remove leftover persistent debug draw messages m_debugDrawMessages.Clear(); MyScene.Clear(); MyClipmapFactory.RemoveAll(); MyClipmap.UnloadCache(); MyInstancing.OnSessionEnd(); MyFoliageComponents.OnSessionEnd(); MyMeshes.OnSessionEnd(); MyLights.OnSessionEnd(); MyMaterials1.OnSessionEnd(); MyVoxelMaterials1.OnSessionEnd(); MyMeshMaterials1.OnSessionEnd(); MyScreenDecals.OnSessionEnd(); MyBigMeshTable.Table.OnSessionEnd(); MyPrimitivesRenderer.Unload(); MyTransparentRendering.OnSessionEnd(); MyBillboardRenderer.OnSessionEnd(); //MyAssetsLoader.ClearMeshes(); }
internal static void Render() { IBorrowedUavTexture accumTarget = MyManagers.RwTexturesPool.BorrowUav("MyTransparentRendering.AccumTarget", Format.R16G16B16A16_Float); IBorrowedUavTexture coverageTarget = MyManagers.RwTexturesPool.BorrowUav("MyTransparentRendering.CoverageTarget", Format.R16_UNorm); ProfilerShort.Begin("Atmosphere"); MyGpuProfiler.IC_BeginBlock("Atmosphere"); if (MyRender11.DebugOverrides.Atmosphere) { MyAtmosphereRenderer.Render(); } ProfilerShort.BeginNextBlock("Clouds"); MyGpuProfiler.IC_BeginNextBlock("Clouds"); if (MyRender11.DebugOverrides.Clouds) { MyCloudRenderer.Render(); } MyGpuProfiler.IC_EndBlock(); // setup weighted blended OIT targets + blend states SetupTargets(accumTarget, coverageTarget, true); IDepthStencil depthResource; if (MyRender11.MultisamplingEnabled) { depthResource = MyScreenDependants.m_resolvedDepth; } else { depthResource = MyGBuffer.Main.DepthStencil; } m_windowsWithDecals.Clear(); ProfilerShort.BeginNextBlock("Billboards"); MyGpuProfiler.IC_BeginBlock("Billboards"); bool resetBindings = MyBillboardRenderer.Gather(HandleWindow); if (resetBindings) { SetupTargets(accumTarget, coverageTarget, false); } MyBillboardRenderer.Render(depthResource.SrvDepth); ProfilerShort.BeginNextBlock("GPU Particles"); MyGpuProfiler.IC_BeginNextBlock("GPU Particles"); if (MyRender11.DebugOverrides.GPUParticles) { MyGPUParticleRenderer.Run(depthResource.SrvDepth); } MyGpuProfiler.IC_EndBlock(); // Render decals on transparent surfaces in 2 steps: first far, second proximity float intervalMax = MyScreenDecals.VISIBLE_DECALS_SQ_TH; for (int it = 0; it < m_distances.Length; it++) { float intervalMin = m_distances[it]; ProfilerShort.BeginNextBlock("Billboards - Depth Only"); MyGpuProfiler.IC_BeginBlock("Billboards - Depth Only"); bool windowsFound = MyBillboardRenderer.RenderWindowsDepthOnly(depthResource, MyGlobalResources.Gbuffer1Copy, intervalMin, intervalMax); MyGpuProfiler.IC_EndBlock(); if (windowsFound) { SetupTargets(accumTarget, coverageTarget, false); ProfilerShort.BeginNextBlock("Render decals - Transparent"); MyGpuProfiler.IC_BeginBlock("Render decals - Transparent"); MyScreenDecals.Draw(true, m_windowsWithDecals); MyGpuProfiler.IC_EndBlock(); } intervalMax = intervalMin; } if (IsUsedOverlappingHeatMap()) { DisplayOverlappingHeatMap(accumTarget, coverageTarget, MyRender11.Settings.DisplayTransparencyHeatMapInGrayscale); } MyGpuProfiler.IC_BeginBlock("OIT Resolve"); // resolve weighted blended OIT in accum / coverage to LBuffer if (MyRender11.DebugOverrides.OIT) { ResolveOIT(accumTarget, coverageTarget); } else { RC.SetRtv(null); } MyGpuProfiler.IC_EndBlock(); coverageTarget.Release(); accumTarget.Release(); ProfilerShort.End(); }
internal static unsafe void InitSubsystems() { MyManagers.OnDeviceInit(); //MyRwTextures.Init(); MyHwBuffers.Init(); ResetShadows(MyShadowCascades.Settings.NewData.CascadesCount, RenderSettings.ShadowQuality.ShadowCascadeResolution()); MyRender11.Init(); MyCommon.Init(); MyVertexLayouts.Init(); MyShaders.Init(); MyMeshes.Init(); MyMeshTableSrv.Init(); MyLightRendering.Init(); MyLinesRenderer.Init(); MySpritesRenderer.Init(); MyPrimitivesRenderer.Init(); MyOutline.Init(); MyBlur.Init(); MyTransparentRendering.Init(); MyFoliageComponents.Init(); MyBillboardRenderer.Init(); // hardcoded limits MyDebugRenderer.Init(); MyScreenDecals.Init(); MyEnvProbeProcessing.Init(); MyAtmosphereRenderer.Init(); MyCloudRenderer.Init(); MyAAEdgeMarking.Init(); MyScreenPass.Init(); MyCopyToRT.Init(); MyBlendTargets.Init(); MyFXAA.Init(); MyDepthResolve.Init(); MyBloom.Init(); MyLuminanceAverage.Init(); MyToneMapping.Init(); MySSAO.Init(); MyHdrDebugTools.Init(); MySceneMaterials.Init(); MyMaterials1.Init(); MyVoxelMaterials1.Init(); MyMeshMaterials1.Init(); MyHBAO.Init(); try { if (m_settings.UseStereoRendering) { var openVR = new MyOpenVR(); MyStereoStencilMask.InitUsingOpenVR(); } } catch (System.Exception e) { if (!VRage.MyCompilationSymbols.DX11ForceStereo) { throw; } MyStereoStencilMask.InitUsingUndefinedMask(); } }
private static void UpdateSceneFrame() { var desc = new RasterizerStateDescription(); desc.FillMode = FillMode.Solid; desc.CullMode = CullMode.None; desc.IsFrontCounterClockwise = true; desc.DepthBias = 25000; desc.DepthBiasClamp = 2; desc.SlopeScaledDepthBias = 1; MyPipelineStates.Modify(m_shadowRasterizerState, desc); MyMeshes.Load(); QueryTexturesFromEntities(); MyTextures.Load(); GatherTextures(); MyComponents.UpdateCullProxies(); MyComponents.ProcessEntities(); MyComponents.SendVisible(); MyBillboardRenderer.OnFrameStart(); MyRender11.GetRenderProfiler().StartProfilingBlock("RebuildProxies"); foreach (var renderable in MyComponentFactory <MyRenderableComponent> .GetAll()) { renderable.RebuildRenderProxies(); } MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("UpdateProxies"); UpdateActors(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyBigMeshTable.Table.MoveToGPU(); MyRender11.GetRenderProfiler().StartProfilingBlock("Update merged groups"); MyRender11.GetRenderProfiler().StartProfilingBlock("UpdateBeforeDraw"); foreach (var r in MyComponentFactory <MyGroupRootComponent> .GetAll()) { r.UpdateBeforeDraw(); } MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("MoveToGPU"); foreach (var r in MyComponentFactory <MyGroupRootComponent> .GetAll()) { foreach (var val in r.m_materialGroups.Values) { // optimize: keep list+set for updating val.MoveToGPU(); } } MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("Fill foliage streams"); MyGpuProfiler.IC_BeginBlock("Fill foliage streams"); MyGPUFoliageGenerating.GetInstance().PerFrame(); MyGPUFoliageGenerating.GetInstance().Begin(); foreach (var foliage in MyComponentFactory <MyFoliageComponent> .GetAll()) { if (foliage.m_owner.CalculateCameraDistance() < MyRender11.RenderSettings.FoliageDetails.GrassDrawDistance()) { foliage.FillStreams(); } else { foliage.InvalidateStreams(); } } MyGPUFoliageGenerating.GetInstance().End(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyCommon.MoveToNextFrame(); }
private static void DrawGameScene(bool blitToBackbuffer) { ResetStats(); MyCommon.UpdateFrameConstants(); // todo: shouldn't be necessary if (true) { MyImmediateRC.RC.Clear(); MyImmediateRC.RC.Context.ClearState(); } MyRender11.GetRenderProfiler().StartProfilingBlock("MyGeometryRenderer.Render"); MyGpuProfiler.IC_BeginBlock("MyGeometryRenderer.Render"); MyGeometryRenderer.Render(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); // cleanup context atfer deferred lists if (MyRender11.DeferredContextsEnabled) { MyImmediateRC.RC.Clear(); } // todo: shouldn't be necessary if (true) { MyImmediateRC.RC.Clear(); MyImmediateRC.RC.Context.ClearState(); } MyRender11.GetRenderProfiler().StartProfilingBlock("Render decals"); MyGpuProfiler.IC_BeginBlock("Render decals"); MyRender11.CopyGbufferToScratch(); MyScreenDecals.Draw(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("Render foliage"); MyGpuProfiler.IC_BeginBlock("Render foliage"); MyFoliageRenderer.Render(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MySceneMaterials.MoveToGPU(); MyRender11.GetRenderProfiler().StartProfilingBlock("Postprocessing"); MyGpuProfiler.IC_BeginBlock("Postprocessing"); if (MultisamplingEnabled) { MyRender11.Context.ClearDepthStencilView(MyScreenDependants.m_resolvedDepth.m_DSV, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 0); MyGpuProfiler.IC_BeginBlock("MarkAAEdges"); MyAAEdgeMarking.Run(); MyGpuProfiler.IC_EndBlock(); MyDepthResolve.Run(MyScreenDependants.m_resolvedDepth, MyGBuffer.Main.DepthStencil.Depth); } MyGpuProfiler.IC_BeginBlock("MarkCascades"); MyShadows.MarkCascadesInStencil(); MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Shadows resolve"); MyShadowsResolve.Run(); MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("SSAO"); if (Postprocess.EnableSsao) { MySSAO.Run(MyScreenDependants.m_ambientOcclusion, MyGBuffer.Main, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.Depth : MyGBuffer.Main.DepthStencil.Depth); } else { MyRender11.Context.ClearRenderTargetView(MyScreenDependants.m_ambientOcclusion.m_RTV, Color4.White); } MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Lights"); MyLightRendering.Render(); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().StartProfilingBlock("Billboards"); MyGpuProfiler.IC_BeginBlock("Billboards"); MyRender11.Context.ClearRenderTargetView((MyScreenDependants.m_particlesRT as IRenderTargetBindable).RTV, new Color4(0, 0, 0, 0)); if (MyRender11.MultisamplingEnabled) { MyBillboardRenderer.Render(MyScreenDependants.m_particlesRT, MyScreenDependants.m_resolvedDepth, MyScreenDependants.m_resolvedDepth.Depth); } else { MyBillboardRenderer.Render(MyScreenDependants.m_particlesRT, MyGBuffer.Main.DepthStencil, MyGBuffer.Main.DepthStencil.Depth); } MyBlendTargets.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyScreenDependants.m_particlesRT, MyRender11.BlendAlphaPremult); MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); MyAtmosphereRenderer.Render(); MyGpuProfiler.IC_BeginBlock("Luminance reduction"); MyBindableResource avgLum = null; if (MyRender11.MultisamplingEnabled) { //MyLBufferResolve.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBufferResolved), MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyGBuffer.Main.DepthStencil.Stencil); MyImmediateRC.RC.Context.ResolveSubresource(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer).m_resource, 0, MyGBuffer.Main.Get(MyGbufferSlot.LBufferResolved).m_resource, 0, SharpDX.DXGI.Format.R11G11B10_Float); } if (m_resetEyeAdaptation) { MyImmediateRC.RC.Context.ClearUnorderedAccessView(m_prevLum.m_UAV, Int4.Zero); m_resetEyeAdaptation = false; } avgLum = MyLuminanceAverage.Run(m_reduce0, m_reduce1, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), m_prevLum, m_localLum); MyGpuProfiler.IC_EndBlock(); if (MyRender11.Settings.DispalyHdrDebug) { var src = MyGBuffer.Main.Get(MyGbufferSlot.LBuffer) as MyRenderTarget; MyHdrDebugTools.CreateHistogram(src.m_SRV, src.m_resolution, src.m_samples.X); } MyGpuProfiler.IC_BeginBlock("Bloom"); var bloom = MyBloom.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum); MyGpuProfiler.IC_EndBlock(); MyBindableResource tonemapped; if (MyRender11.FxaaEnabled) { tonemapped = m_rgba8_linear; } else { tonemapped = m_uav3; } MyGpuProfiler.IC_BeginBlock("Tone mapping"); MyToneMapping.Run(tonemapped, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum, bloom, MyRender11.Settings.EnableTonemapping && Postprocess.EnableTonemapping && MyRender11.RenderSettings.TonemappingEnabled); MyGpuProfiler.IC_EndBlock(); MyBindableResource renderedImage; if (MyRender11.FxaaEnabled) { MyGpuProfiler.IC_BeginBlock("FXAA"); MyFXAA.Run(m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm, View = MyViewEnum.RtvView }), tonemapped); MyGpuProfiler.IC_EndBlock(); renderedImage = m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); } else { //renderedImage = (tonemapped as MyCustomTexture).GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); renderedImage = tonemapped; } if (MyOutline.AnyOutline()) { MyOutline.Run(); if (MyRender11.FxaaEnabled) { MyBlendTargets.RunWithStencil(m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendAdditive); } else { if (MyRender11.MultisamplingEnabled) { MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendAdditive); } else { MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendAdditive); } } } m_finalImage = renderedImage; if (blitToBackbuffer) { MyCopyToRT.Run(Backbuffer, renderedImage); } if (MyRender11.Settings.DispalyHdrDebug) { MyHdrDebugTools.DisplayHistogram(Backbuffer.m_RTV, (avgLum as IShaderResourceBindable).SRV); } MyGpuProfiler.IC_EndBlock(); MyRender11.GetRenderProfiler().EndProfilingBlock(); }
internal static void Render(MyUnorderedAccessTexture accumTarget, MyUnorderedAccessTexture coverageTarget) { ProfilerShort.Begin("Atmosphere"); MyGpuProfiler.IC_BeginBlock("Atmosphere"); if (MyRender11.DebugOverrides.Atmosphere) { MyAtmosphereRenderer.Render(); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Clouds"); MyGpuProfiler.IC_BeginBlock("Clouds"); if (MyRender11.DebugOverrides.Clouds) { MyCloudRenderer.Render(); } MyGpuProfiler.IC_EndBlock(); // setup weighted blended OIT targets + blend states if (MyRender11.DebugOverrides.OIT) { SetupOIT(accumTarget, coverageTarget, true); } else { SetupStandard(); } MyDepthStencil depthResource; if (MyRender11.MultisamplingEnabled) { depthResource = MyScreenDependants.m_resolvedDepth; } else { depthResource = MyGBuffer.Main.DepthStencil; } ProfilerShort.BeginNextBlock("Billboards"); MyGpuProfiler.IC_BeginBlock("Billboards"); MyBillboardRenderer.Render(depthResource.Depth); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("GPU Particles"); MyGpuProfiler.IC_BeginBlock("GPU Particles"); if (MyRender11.DebugOverrides.GPUParticles) { MyGPUParticleRenderer.Run(depthResource.Depth); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Billboards - Depth Only"); MyGpuProfiler.IC_BeginBlock("Billboards - Depth Only"); bool windowsFound = MyBillboardRenderer.RenderWindowsDepthOnly(depthResource, MyRender11.Gbuffer1Copy); MyGpuProfiler.IC_EndBlock(); if (MyRender11.DebugOverrides.OIT && windowsFound) { SetupOIT(accumTarget, coverageTarget, false); } ProfilerShort.BeginNextBlock("Render decals - Transparent"); MyGpuProfiler.IC_BeginBlock("Render decals - Transparent"); MyScreenDecals.Draw(true); MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("OIT Resolve"); // resolve weighted blended OIT in accum / coverage to LBuffer if (MyRender11.DebugOverrides.OIT) { ResolveOIT(accumTarget, coverageTarget); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); }
internal static void Render(IRtvTexture gbuffer1Copy) { IBorrowedUavTexture accumTarget = MyManagers.RwTexturesPool.BorrowUav("MyTransparentRendering.AccumTarget", Format.R16G16B16A16_Float); IBorrowedUavTexture coverageTarget = MyManagers.RwTexturesPool.BorrowUav("MyTransparentRendering.CoverageTarget", Format.R16_UNorm); ProfilerShort.Begin("Atmosphere"); MyGpuProfiler.IC_BeginBlock("Atmosphere"); if (MyRender11.DebugOverrides.Atmosphere) { MyAtmosphereRenderer.RenderGBuffer(); } ProfilerShort.BeginNextBlock("Clouds"); MyGpuProfiler.IC_BeginNextBlock("Clouds"); if (MyRender11.DebugOverrides.Clouds) { MyCloudRenderer.Render(); } var depthResource = MyGBuffer.Main.ResolvedDepthStencil; // setup weighted blended OIT targets + blend states if (MyRender11.Settings.DrawBillboards) { ProfilerShort.BeginNextBlock("Billboards"); MyGpuProfiler.IC_BeginNextBlock("Billboards"); MyBillboardRenderer.Gather(); MyBillboardRenderer.RenderAdditveBottom(depthResource.SrvDepth); SetupTargets(accumTarget, coverageTarget, true); MyBillboardRenderer.RenderStandard(depthResource.SrvDepth); } else { SetupTargets(accumTarget, coverageTarget, true); } ProfilerShort.BeginNextBlock("GPU Particles"); MyGpuProfiler.IC_BeginNextBlock("GPU Particles"); if (MyRender11.DebugOverrides.GPUParticles) { MyGPUParticleRenderer.Run(depthResource.SrvDepth, MyGBuffer.Main.GBuffer1); } // Render decals on transparent surfaces in 2 steps: first far, second proximity if (MyRender11.Settings.DrawGlass) { ProfilerShort.BeginNextBlock("Static glass"); MyGpuProfiler.IC_BeginNextBlock("Static glass"); m_glassWithDecals.Clear(); MyStaticGlassRenderer.Render(HandleGlass); float intervalMax = MyScreenDecals.VISIBLE_DECALS_SQ_TH; for (int it = 0; it < m_distances.Length; it++) { float intervalMin = m_distances[it]; ProfilerShort.BeginNextBlock("Glass - Depth Only"); MyGpuProfiler.IC_BeginNextBlock("Glass - Depth Only"); //TODO: This code should properly render glass decals, that they are visible when looking through window on another window // Anyway, it is italian code and it doesnt work. Solve after Beta bool glassFound = MyStaticGlassRenderer.RenderGlassDepthOnly(depthResource, gbuffer1Copy, intervalMin, intervalMax); // if (glassFound) { SetupTargets(accumTarget, coverageTarget, false); ProfilerShort.BeginNextBlock("Render decals - Transparent"); MyGpuProfiler.IC_BeginNextBlock("Render decals - Transparent"); MyScreenDecals.Draw(gbuffer1Copy, true /*, m_glassWithDecals*/); } intervalMax = intervalMin; } } if (IsUsedOverlappingHeatMap()) { DisplayOverlappingHeatMap(accumTarget, coverageTarget, MyRender11.Settings.DisplayTransparencyHeatMapInGrayscale); } MyGpuProfiler.IC_BeginNextBlock("OIT Resolve"); // resolve weighted blended OIT in accum / coverage to LBuffer if (MyRender11.DebugOverrides.OIT) { ResolveOIT(accumTarget, coverageTarget); } ProfilerShort.BeginNextBlock("Billboards"); MyGpuProfiler.IC_BeginNextBlock("Billboards"); if (MyRender11.Settings.DrawBillboards) { MyBillboardRenderer.RenderAdditveTop(depthResource.SrvDepth); } RC.SetRtv(null); MyGpuProfiler.IC_EndBlock(); coverageTarget.Release(); accumTarget.Release(); ProfilerShort.End(); }
// Returns the final image and copies it to renderTarget if non-null private static MyBindableResource DrawGameScene(MyBindableResource renderTarget) { ProfilerShort.Begin("DrawGameScene"); PrepareGameScene(); // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear"); MyRenderContext.Immediate.Clear(); MyRenderContext.Immediate.DeviceContext.ClearState(); ProfilerShort.End(); } Debug.Assert(m_commandLists.Count == 0, "Not all command lists executed last frame!"); DynamicGeometryRenderer.Render(m_commandLists, true); if (MyScene.SeparateGeometry) { StaticGeometryRenderer.Render(m_commandLists, false); } SendGlobalOutputMessages(); ExecuteCommandLists(m_commandLists); MyEnvironmentProbe.FinalizeEnvProbes(); // cleanup context atfer deferred lists if (MyRender11.DeferredContextsEnabled) { ProfilerShort.Begin("Clear2"); MyRenderContext.Immediate.Clear(); ProfilerShort.End(); } // todo: shouldn't be necessary if (true) { ProfilerShort.Begin("Clear3"); MyRenderContext.Immediate.Clear(); MyRenderContext.Immediate.DeviceContext.ClearState(); ProfilerShort.End(); } ProfilerShort.Begin("Render decals"); MyGpuProfiler.IC_BeginBlock("Render decals"); MyRender11.CopyGbufferToScratch(); MyScreenDecals.Draw(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Render foliage"); MyGpuProfiler.IC_BeginBlock("Render foliage"); m_foliageRenderer.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("MySceneMaterials.MoveToGPU"); MySceneMaterials.MoveToGPU(); ProfilerShort.BeginNextBlock("Postprocessing"); MyGpuProfiler.IC_BeginBlock("Postprocessing"); if (MultisamplingEnabled) { MyRender11.DeviceContext.ClearDepthStencilView(MyScreenDependants.m_resolvedDepth.m_DSV, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1, 0); MyGpuProfiler.IC_BeginBlock("MarkAAEdges"); MyAAEdgeMarking.Run(); MyGpuProfiler.IC_EndBlock(); MyDepthResolve.Run(MyScreenDependants.m_resolvedDepth, MyGBuffer.Main.DepthStencil.Depth); } if (MyScene.SeparateGeometry) { MyShadowCascadesPostProcess.Combine(MyShadowCascades.CombineShadowmapArray, DynamicShadows.ShadowCascades, StaticShadows.ShadowCascades); DynamicShadows.ShadowCascades.PostProcess(MyRender11.PostProcessedShadows, MyShadowCascades.CombineShadowmapArray); } else { DynamicShadows.ShadowCascades.PostProcess(MyRender11.PostProcessedShadows, DynamicShadows.ShadowCascades.CascadeShadowmapArray); } MyGpuProfiler.IC_BeginBlock("SSAO"); if (Postprocess.EnableSsao) { MySSAO.Run(MyScreenDependants.m_ambientOcclusion, MyGBuffer.Main, MyRender11.MultisamplingEnabled ? MyScreenDependants.m_resolvedDepth.Depth : MyGBuffer.Main.DepthStencil.Depth); if (MySSAO.UseBlur) { MyBlur.Run(MyScreenDependants.m_ambientOcclusion, MyScreenDependants.m_ambientOcclusionHelper, MyScreenDependants.m_ambientOcclusion); } } else { MyRender11.DeviceContext.ClearRenderTargetView(MyScreenDependants.m_ambientOcclusion.m_RTV, Color4.White); } MyGpuProfiler.IC_EndBlock(); MyGpuProfiler.IC_BeginBlock("Lights"); MyLightRendering.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Billboards"); MyGpuProfiler.IC_BeginBlock("Billboards"); if (MyRender11.MultisamplingEnabled) { MyBillboardRenderer.Render(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyScreenDependants.m_resolvedDepth, MyScreenDependants.m_resolvedDepth.Depth); } else { MyBillboardRenderer.Render(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyGBuffer.Main.DepthStencil, MyGBuffer.Main.DepthStencil.Depth); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Atmosphere"); MyGpuProfiler.IC_BeginBlock("Atmosphere"); MyAtmosphereRenderer.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Clouds"); MyGpuProfiler.IC_BeginBlock("Clouds"); MyCloudRenderer.Render(); MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); MyGpuProfiler.IC_BeginBlock("Luminance reduction"); MyBindableResource avgLum = null; if (MyRender11.MultisamplingEnabled) { MyRenderContext.Immediate.DeviceContext.ResolveSubresource(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer).m_resource, 0, MyGBuffer.Main.Get(MyGbufferSlot.LBufferResolved).m_resource, 0, SharpDX.DXGI.Format.R11G11B10_Float); } if (m_resetEyeAdaptation) { MyRenderContext.Immediate.DeviceContext.ClearUnorderedAccessView(m_prevLum.m_UAV, Int4.Zero); m_resetEyeAdaptation = false; } avgLum = MyLuminanceAverage.Run(m_reduce0, m_reduce1, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), m_prevLum); MyGpuProfiler.IC_EndBlock(); if (MyRender11.Settings.DisplayHdrDebug) { var src = MyGBuffer.Main.Get(MyGbufferSlot.LBuffer) as MyRenderTarget; MyHdrDebugTools.CreateHistogram(src.m_SRV, src.m_resolution, src.m_samples.X); } MyGpuProfiler.IC_BeginBlock("Bloom"); var bloom = MyBloom.Run(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum); MyGpuProfiler.IC_EndBlock(); MyBindableResource tonemapped; if (MyRender11.FxaaEnabled) { tonemapped = m_rgba8_linear; } else { tonemapped = m_uav3; } MyGpuProfiler.IC_BeginBlock("Tone mapping"); MyToneMapping.Run(tonemapped, MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), avgLum, bloom, Postprocess.EnableTonemapping); MyGpuProfiler.IC_EndBlock(); MyBindableResource renderedImage; if (MyRender11.FxaaEnabled) { MyGpuProfiler.IC_BeginBlock("FXAA"); MyFXAA.Run(m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm, View = MyViewEnum.RtvView }), tonemapped); MyGpuProfiler.IC_EndBlock(); renderedImage = m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); } else { //renderedImage = (tonemapped as MyCustomTexture).GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.SrvView }); renderedImage = tonemapped; } ProfilerShort.Begin("Outline"); if (MyOutline.AnyOutline()) { MyOutline.Run(); MyGpuProfiler.IC_BeginBlock("Outline Blending"); ProfilerShort.Begin("Outline Blending"); if (MyRender11.FxaaEnabled) { MyBlendTargets.RunWithStencil( m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendAdditive, MyDepthStencilState.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil( m_rgba8_0.GetView(new MyViewKey { Fmt = SharpDX.DXGI.Format.R8G8B8A8_UNorm_SRgb, View = MyViewEnum.RtvView }), MyRender11.m_rgba8_1, MyRender11.BlendTransparent, MyDepthStencilState.TestHighlightMeshStencil, 0x40); } else { if (MyRender11.MultisamplingEnabled) { MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_ms, MyRender11.BlendAdditive); MyBlendTargets.RunWithPixelStencilTest(tonemapped, MyRender11.m_rgba8_ms, MyRender11.BlendTransparent, true); } else { MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendAdditive, MyDepthStencilState.TestOutlineMeshStencil, 0x40); MyBlendTargets.RunWithStencil(tonemapped, MyRender11.m_rgba8_1, MyRender11.BlendTransparent, MyDepthStencilState.TestHighlightMeshStencil, 0x40); } } ProfilerShort.End(); MyGpuProfiler.IC_EndBlock(); } ProfilerShort.End(); if (renderTarget != null) { MyCopyToRT.Run(renderTarget, renderedImage); } if (MyRender11.Settings.DisplayHdrDebug) { MyHdrDebugTools.DisplayHistogram((renderTarget as IRenderTargetBindable).RTV, (avgLum as IShaderResourceBindable).SRV); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); return(renderedImage); }
internal static void Render(MyUnorderedAccessTexture accumTarget, MyUnorderedAccessTexture coverageTarget) { ProfilerShort.Begin("Billboards"); MyGpuProfiler.IC_BeginBlock("Billboards"); if (MyRender11.MultisamplingEnabled) { MyBillboardRenderer.Render(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyScreenDependants.m_resolvedDepth, MyScreenDependants.m_resolvedDepth.Depth); } else { MyBillboardRenderer.Render(MyGBuffer.Main.Get(MyGbufferSlot.LBuffer), MyGBuffer.Main.DepthStencil, MyGBuffer.Main.DepthStencil.Depth); } MyGpuProfiler.IC_EndBlock(); // setup weighted blended OIT targets + blend states if (MyRender11.DebugOverrides.OIT) { SetupOIT(accumTarget, coverageTarget); } else { SetupStandard(); } ProfilerShort.BeginNextBlock("GPU Particles"); MyGpuProfiler.IC_BeginBlock("GPU Particles"); if (MyRender11.DebugOverrides.GPUParticles) { if (MyRender11.MultisamplingEnabled) { MyGPUParticleRenderer.Run(MyScreenDependants.m_resolvedDepth.Depth); } else { MyGPUParticleRenderer.Run(MyGBuffer.Main.DepthStencil.Depth); } } MyGpuProfiler.IC_EndBlock(); // resolve weighted blended OIT in accum / coverage to LBuffer if (MyRender11.DebugOverrides.OIT) { ResolveOIT(accumTarget, coverageTarget); } ProfilerShort.BeginNextBlock("Atmosphere"); MyGpuProfiler.IC_BeginBlock("Atmosphere"); if (MyRender11.DebugOverrides.Atmosphere) { MyAtmosphereRenderer.Render(); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.BeginNextBlock("Clouds"); MyGpuProfiler.IC_BeginBlock("Clouds"); if (MyRender11.DebugOverrides.Clouds) { MyCloudRenderer.Render(); } MyGpuProfiler.IC_EndBlock(); ProfilerShort.End(); }