Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        internal static void PrepareCulling()
        {
            m_cullQuery.Reset();
            m_wavefront.Clear();

            // add main camera
            AddCamera(ref MyEnvironment.ViewD, ref MyEnvironment.OriginalProjectionD,
                      new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y),
                      MyGBuffer.Main);
            m_cullQuery.FrustumQueries[m_wavefront.Count - 1].Type = MyFrustumEnum.MainFrustum;

            MyShadows.PrepareShadowmaps();
            foreach (var query in MyShadows.ShadowMapQueries)
            {
                bool isCascade = query.QueryType == MyFrustumEnum.ShadowCascade;
                AddShadowCaster(new BoundingFrustumD(query.ProjectionInfo.WorldToProjection), query.ProjectionInfo.CurrentLocalToProjection, query.Viewport, query.DepthBuffer, isCascade, query.QueryType.ToString());

                if (isCascade)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = query.ProjectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.ShadowCascadeSmallSkipThresholds[query.CascadeIndex];
                    m_cullQuery.FrustumQueries[m_wavefront.Count - 1].SmallObjects = smallCulling;
                    m_cullQuery.FrustumQueries[m_wavefront.Count - 1].CascadeIndex = query.CascadeIndex;
                }

                m_cullQuery.FrustumQueries[m_wavefront.Count - 1].Type    = query.QueryType;
                m_cullQuery.FrustumQueries[m_wavefront.Count - 1].Ignored = query.IgnoredEntities;
            }
        }
Ejemplo n.º 3
0
        internal static void UpdateRenderSettings(MyRenderSettings1 settings)
        {
            MyRender11.Log.WriteLine("UpdateRenderSettings");
            MyRender11.Log.IncreaseIndent();

            var prevSettings = m_renderSettings;

            m_renderSettings = settings;

            LogUpdateRenderSettings(ref settings);

            MyRenderProxy.Settings.EnableCameraInterpolation = settings.InterpolationEnabled;
            MyRenderProxy.Settings.EnableObjectInterpolation = settings.InterpolationEnabled;

            MyRenderProxy.Settings.GrassDensityFactor = settings.GrassDensityFactor;

            //       if(settings.GrassDensityFactor != prevSettings.GrassDensityFactor)
            //           MyRenderProxy.ReloadGrass();

            if (settings.ShadowQuality != prevSettings.ShadowQuality)
            {
                MyShadows.ResizeCascades();
            }

            if (settings.AntialiasingMode != prevSettings.AntialiasingMode)
            {
                GlobalShaderHeader = MyShaderHelpers.FormatMacros(MyRender11.ShaderMultisamplingDefine(), MyRender11.FxaaEnabled ? "FXAA_ENABLED" : null);
                MyShaders.Recompile();
                MyMaterialShaders.Recompile();
                MyRenderableComponent.MarkAllDirty();

                if (settings.AntialiasingMode.SamplesCount() != prevSettings.AntialiasingMode.SamplesCount())
                {
                    CreateScreenResources();
                }
            }

            if (settings.AnisotropicFiltering != prevSettings.AnisotropicFiltering)
            {
                UpdateTextureSampler(m_textureSamplerState, TextureAddressMode.Wrap);
                UpdateTextureSampler(m_alphamaskarraySamplerState, TextureAddressMode.Clamp);
            }

            if (settings.TextureQuality != prevSettings.TextureQuality)
            {
                //MyTextureManager.UnloadTextures();

                MyVoxelMaterials1.InvalidateMaterials();
                MyMeshMaterials1.InvalidateMaterials();
                MyTextures.ReloadQualityDependantTextures();

                //MyVoxelMaterials.ReloadTextures();
                //MyMaterialProxyFactory.ReloadTextures();
            }

            m_settingsChangedListeners();

            MyRender11.Log.DecreaseIndent();
        }
 internal MyGeometryRenderer(MyDynamicAABBTreeD renderablesDBVH, MyShadows shadowHandler)
 {
     m_renderablesDBVH = renderablesDBVH;
     m_shadowHandler = shadowHandler;
     m_cullQuery = new MyCullQuery();
     m_visibilityCuller = new MyFrustumCuller();
     m_renderingDispatcher = new MyRenderingDispatcher();
 }
Ejemplo n.º 5
0
 internal MyGeometryRenderer(MyDynamicAABBTreeD renderablesDBVH, MyShadows shadowHandler)
 {
     m_renderablesDBVH     = renderablesDBVH;
     m_shadowHandler       = shadowHandler;
     m_cullQuery           = new MyCullQuery();
     m_visibilityCuller    = new MyFrustumCuller();
     m_renderingDispatcher = new MyRenderingDispatcher();
 }
Ejemplo n.º 6
0
        internal static void PrepareCulling()
        {
            m_cullQuery.Reset();
            m_wavefront.Clear();

            // add main camera
            AddCamera(ref MyEnvironment.View, ref MyEnvironment.Projection,
                      new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y),
                      MyGBuffer.Main);
            m_cullQuery.FrustumQuery[m_wavefront.Count - 1].Type = MyFrustumEnum.MainFrustum;

            MyShadows.ResetShadowmaps();
            foreach (var query in MyShadows.ShadowmapList)
            {
                bool isCascade = query.QueryType == MyFrustumEnum.Cascade0 || query.QueryType == MyFrustumEnum.Cascade1 || query.QueryType == MyFrustumEnum.Cascade2 || query.QueryType == MyFrustumEnum.Cascade3;
                AddShadowCaster(new BoundingFrustum(query.ProjectionInfo.WorldToProjection), query.ProjectionInfo.CurrentLocalToProjection, query.Viewport, query.DepthBuffer, isCascade, query.QueryType.ToString());

                if (query.QueryType == MyFrustumEnum.Cascade0)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade0SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }
                else if (query.QueryType == MyFrustumEnum.Cascade1)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade1SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }
                else if (query.QueryType == MyFrustumEnum.Cascade2)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade2SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }
                else if (query.QueryType == MyFrustumEnum.Cascade3)
                {
                    var smallCulling = new MyCullingSmallObjects();
                    smallCulling.ProjectionDir    = query.ProjectionDir;
                    smallCulling.ProjectionFactor = 1;// query.projectionFactor;
                    smallCulling.SkipThreshhold   = MyRender11.Settings.Cascade3SmallSkip;
                    m_cullQuery.FrustumQuery[m_wavefront.Count - 1].SmallObjects = smallCulling;
                }

                m_cullQuery.FrustumQuery[m_wavefront.Count - 1].Type    = query.QueryType;
                m_cullQuery.FrustumQuery[m_wavefront.Count - 1].Ignored = query.IgnoredEntities;
            }
        }
Ejemplo n.º 7
0
        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
        }
Ejemplo n.º 8
0
        private static void ResetShadows(int cascadeCount, int cascadeResolution)
        {
            if (DynamicShadows != null)
                DynamicShadows.Reset(cascadeCount, cascadeResolution);
            else
                DynamicShadows = new MyShadows(cascadeCount, cascadeResolution);

            if (StaticShadows != null)
                StaticShadows.Reset(cascadeCount, cascadeResolution);
            else if(MyScene.SeparateGeometry)
                StaticShadows = new MyShadows(cascadeCount, cascadeResolution);

            InitShadowCascadeUpdateIntervals(cascadeCount);
        }
Ejemplo n.º 9
0
        private static void ResetShadows(int cascadeCount, int cascadeResolution)
        {
            if (DynamicShadows != null)
            {
                DynamicShadows.Reset(cascadeCount, cascadeResolution);
            }
            else
            {
                DynamicShadows = new MyShadows(cascadeCount, cascadeResolution);
            }

            if (StaticShadows != null)
            {
                StaticShadows.Reset(cascadeCount, cascadeResolution);
            }
            else if (MyScene.SeparateGeometry)
            {
                StaticShadows = new MyShadows(cascadeCount, cascadeResolution);
            }

            InitShadowCascadeUpdateIntervals(cascadeCount);
        }
Ejemplo n.º 10
0
        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();
        }
Ejemplo n.º 11
0
 private static void InitShadows(int cascadeCount, int cascadeResolution)
 {
     DynamicShadows = new MyShadows(cascadeCount, cascadeResolution);
     StaticShadows  = new MyShadows(cascadeCount, cascadeResolution);
 }
Ejemplo n.º 12
0
 private static void InitShadows(int cascadeCount, int cascadeResolution)
 {
     DynamicShadows = new MyShadows(cascadeCount, cascadeResolution);
     StaticShadows = new MyShadows(cascadeCount, cascadeResolution);
 }