Exemple #1
0
    void OnParticlesDrawing(ScriptableRenderContext context, RenderingData data, ScriptableRenderer render)
    {
        UpdateParticles(data);
        CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);

        using (new ProfilingSample(cmd, m_ProfilerTag))
        {
            ForwardRenderer forwardRenderer = render as ForwardRenderer;
            cmd.SetRenderTarget(forwardRenderer.ActiveCameraColorRT, forwardRenderer.DepthRT);
            cmd.SetGlobalBuffer("particles", m_pingpongBuffer[1 - m_currentBufferIndex]);
            cmd.SetGlobalBuffer("quad", quad);
            if (enableSorting)
            {
                cmd.SetGlobalBuffer("indexBuffer", indexBuffer);
                particalMat.EnableKeyword("ENABLE_SORTINT");
            }
            else
            {
                particalMat.DisableKeyword("ENABLE_SORTINT");
            }
            cmd.DrawProceduralIndirect(Matrix4x4.identity, particalMat, 0, MeshTopology.Triangles, indirectdrawbuffer);
        }
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
        context.Submit();
    }
 public static ForwardRenderer SetClearOptions(this ForwardRenderer forwardRenderer, Color4 color, float depth = 1, byte stencilValue = 0, ClearRendererFlags clearFlags = ClearRendererFlags.ColorAndDepth)
 {
     forwardRenderer.Clear.Color      = new XenkoMath.Color4(color.Red, color.Green, color.Blue, color.Alpha);
     forwardRenderer.Clear.ClearFlags = clearFlags;
     forwardRenderer.Clear.Depth      = depth;
     forwardRenderer.Clear.Stencil    = stencilValue;
     return(forwardRenderer);
 }
Exemple #3
0
 private void UpdateForwardRenderTag()
 {
     Camera.main.TryGetComponent <UniversalAdditionalCameraData>(out var baseCameraAdditionalData);
     if (baseCameraAdditionalData != null)
     {
         var             render          = baseCameraAdditionalData.scriptableRenderer;
         ForwardRenderer forwardRenderer = render as ForwardRenderer;
         if (forwardRenderer != null)
         {
             forwardRenderer.ChangeSplitUICameraAndSceneCameraRenderer(out m_RecordTag);
         }
     }
 }
Exemple #4
0
        protected override void Initialize()
        {
            base.Initialize();

            _gameTime       = new GameTime(TimeSpan.Zero, TimeSpan.Zero);
            _gameComponents = new List <GameComponent>();

            _services = new GameServiceContainer();
            _services.AddService <IGraphicsDeviceService>(new GraphicsDeviceService(graphicsDevice));

            _content = new ContentManager(this);
            _content.RootDirectory = "Content";

            _projectContent = new ContentManager(this);
            _projectContent.RootDirectory = EDRegistry.ContentTempPath;

            AssetImporter.CreateFolderStructure("Temp");

            Application.Content        = _content;
            Application.GraphicsDevice = GraphicsDevice;

            _gameComponents.Add(EDRegistry.Mouse);
            _gameComponents.Add(EDRegistry.Keys);
            _gameComponents.Add(new Time());

            _renderer = new ForwardRenderer();
            _renderer.Initialize(_content);

            foreach (var component in _gameComponents)
            {
                component.Initialize();
            }

            gizmoComponent            = new GizmoComponent(GraphicsDevice);
            gizmoComponent.ActiveMode = GizmoMode.Translate;

            _scene = new EDScene("Root", gizmoComponent);
            _scene.Initialize();
            _scene.RenderSettings.Skybox.Generate();

            MouseDown += C3DEGameHost_MouseDown;
            MouseUp   += C3DEGameHost_MouseUp;

            if (EngineReady != null)
            {
                EngineReady();
            }
        }
Exemple #5
0
    void OnDepthBounds(ScriptableRenderContext context, RenderingData data, ScriptableRenderer render)
    {
        if (!enableHizCulling)
        {
            return;
        }
        CommandBuffer cmd = CommandBufferPool.Get(m_DepthboundProfilerTag);

        using (new ProfilingSample(cmd, m_DepthboundProfilerTag))
        {
            ForwardRenderer forwardRenderer = render as ForwardRenderer;
            hizBuffer.GeneragteHizTexture(cmd, forwardRenderer.DepthRT, hizBufferCS);
        }
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
        context.Submit();
    }
Exemple #6
0
        private static ShaderFeatures GetSupportedShaderFeatures(UniversalRenderPipelineAsset pipelineAsset)
        {
            ShaderFeatures shaderFeatures;

            shaderFeatures = ShaderFeatures.MainLight;

            if (pipelineAsset.supportsMainLightShadows)
            {
                shaderFeatures |= ShaderFeatures.MainLightShadows;
            }

            if (pipelineAsset.additionalLightsRenderingMode == LightRenderingMode.PerVertex)
            {
                shaderFeatures |= ShaderFeatures.VertexLighting;
            }
            else if (pipelineAsset.additionalLightsRenderingMode == LightRenderingMode.PerPixel)
            {
                shaderFeatures |= ShaderFeatures.AdditionalLights;

                if (pipelineAsset.supportsAdditionalLightShadows)
                {
                    shaderFeatures |= ShaderFeatures.AdditionalLightShadows;
                }
            }

            bool anyShadows = pipelineAsset.supportsMainLightShadows ||
                              (shaderFeatures & ShaderFeatures.AdditionalLightShadows) != 0;

            if (pipelineAsset.supportsSoftShadows && anyShadows)
            {
                shaderFeatures |= ShaderFeatures.SoftShadows;
            }

            if (pipelineAsset.supportsMixedLighting)
            {
                shaderFeatures |= ShaderFeatures.MixedLighting;
            }

            if (pipelineAsset.supportsTerrainHoles)
            {
                shaderFeatures |= ShaderFeatures.TerrainHoles;
            }

            if (pipelineAsset.useFastSRGBLinearConversion)
            {
                shaderFeatures |= ShaderFeatures.UseFastSRGBLinearConversion;
            }

            bool hasScreenSpaceShadows         = false;
            bool hasScreenSpaceOcclusion       = false;
            bool hasDeferredRenderer           = false;
            bool withAccurateGbufferNormals    = false;
            bool withoutAccurateGbufferNormals = false;

            int rendererCount = pipelineAsset.m_RendererDataList.Length;

            for (int rendererIndex = 0; rendererIndex < rendererCount; ++rendererIndex)
            {
                ScriptableRenderer renderer = pipelineAsset.GetRenderer(rendererIndex);
                if (renderer is ForwardRenderer)
                {
                    ForwardRenderer forwardRenderer = (ForwardRenderer)renderer;
                    if (forwardRenderer.renderingMode == RenderingMode.Deferred)
                    {
                        hasDeferredRenderer           |= true;
                        withAccurateGbufferNormals    |= forwardRenderer.accurateGbufferNormals;
                        withoutAccurateGbufferNormals |= !forwardRenderer.accurateGbufferNormals;
                    }
                }

                // Check for Screen Space Ambient Occlusion Renderer Feature
                ScriptableRendererData rendererData = pipelineAsset.m_RendererDataList[rendererIndex];
                if (rendererData != null)
                {
                    for (int rendererFeatureIndex = 0; rendererFeatureIndex < rendererData.rendererFeatures.Count; rendererFeatureIndex++)
                    {
                        ScriptableRendererFeature rendererFeature = rendererData.rendererFeatures[rendererFeatureIndex];

                        ScreenSpaceShadows ssshadows = rendererFeature as ScreenSpaceShadows;
                        hasScreenSpaceShadows |= ssshadows != null;

                        ScreenSpaceAmbientOcclusion ssao = rendererFeature as ScreenSpaceAmbientOcclusion;
                        hasScreenSpaceOcclusion |= ssao != null;
                    }
                }
            }

            if (hasDeferredRenderer)
            {
                shaderFeatures |= ShaderFeatures.DeferredShading;
            }

            // We can only strip accurateGbufferNormals related variants if all DeferredRenderers use the same option.
            if (withAccurateGbufferNormals)
            {
                shaderFeatures |= ShaderFeatures.DeferredWithAccurateGbufferNormals;
            }

            if (withoutAccurateGbufferNormals)
            {
                shaderFeatures |= ShaderFeatures.DeferredWithoutAccurateGbufferNormals;
            }

            if (hasScreenSpaceShadows)
            {
                shaderFeatures |= ShaderFeatures.ScreenSpaceShadows;
            }

            if (hasScreenSpaceOcclusion)
            {
                shaderFeatures |= ShaderFeatures.ScreenSpaceOcclusion;
            }

            return(shaderFeatures);
        }
Exemple #7
0
        /// <summary>
        /// Creates a graphics compositor programatically that renders into a Rendertarget. It can render everything the default Compositor can
        /// </summary>
        public static GraphicsCompositor CreateOffscreenCompositor(
            bool enablePostEffects,
            Texture renderTarget,
            CameraComponent camera    = null,
            RenderGroupMask groupMask = RenderGroupMask.All)
        {
            #region Render stages
            var opaqueRenderStage = new RenderStage("Opaque", "Main")
            {
                SortMode = new StateChangeSortMode()
            };
            var transparentRenderStage = new RenderStage("Transparent", "Main")
            {
                SortMode = new BackToFrontSortMode()
            };
            var shadowMapCaster = new RenderStage("ShadowMapCaster", "ShadowMapCaster")
            {
                SortMode = new FrontToBackSortMode()
            };
            var shadowMapCasterrParaboloidRenderStage = new RenderStage("ShadowMapCasterParaboloid", "ShadowMapCasterParaboloid")
            {
                SortMode = new FrontToBackSortMode()
            };
            var shadowMapCasterCubeMapRenderStage = new RenderStage("ShadowMapCasterCubeMap", "ShadowMapCasterCubeMap")
            {
                SortMode = new FrontToBackSortMode()
            };
            var gBuffer = new RenderStage("GBuffer", "GBuffer")
            {
                SortMode = new FrontToBackSortMode()
            };
            #endregion

            #region RenderFeatures
            var meshRenderFeature = new MeshRenderFeature
            {
                PipelineProcessors =
                {
                    new MeshPipelineProcessor()
                    {
                        TransparentRenderStage = transparentRenderStage
                    },
                    new ShadowMeshPipelineProcessor()
                    {
                        DepthClipping = false, ShadowMapRenderStage = shadowMapCaster
                    },
                    new ShadowMeshPipelineProcessor()
                    {
                        DepthClipping = true, ShadowMapRenderStage = shadowMapCasterrParaboloidRenderStage
                    },
                    new ShadowMeshPipelineProcessor()
                    {
                        DepthClipping = true, ShadowMapRenderStage = shadowMapCasterCubeMapRenderStage
                    }
                },
                RenderFeatures =
                {
                    new TransformRenderFeature(),
                    new SkinningRenderFeature(),
                    new MaterialRenderFeature(),
                    new ShadowCasterRenderFeature(),
                    new ForwardLightingRenderFeature()
                    {
                        LightRenderers =
                        {
                            new LightAmbientRenderer(),
                            new LightDirectionalGroupRenderer(),
                            new LightSkyboxRenderer(),
                            new LightClusteredPointSpotGroupRenderer(),
                            new LightPointGroupRenderer()
                        }
                    }
                },
                RenderStageSelectors =
                {
                    new MeshTransparentRenderStageSelector()
                    {
                        EffectName             = "XenkoForwardShadingEffect",
                        OpaqueRenderStage      = opaqueRenderStage,
                        TransparentRenderStage = transparentRenderStage,
                        RenderGroup            = groupMask
                    },
                    new ShadowMapRenderStageSelector()
                    {
                        EffectName           = "XenkoForwardShadingEffect.ShadowMapCaster",
                        ShadowMapRenderStage = shadowMapCaster,
                        RenderGroup          = groupMask
                    },
                    new ShadowMapRenderStageSelector()
                    {
                        EffectName           = "XenkoForwardShadingEffect.ShadowMapCasterParaboloid",
                        ShadowMapRenderStage = shadowMapCasterrParaboloidRenderStage,
                        RenderGroup          = groupMask
                    },
                    new ShadowMapRenderStageSelector()
                    {
                        EffectName           = "XenkoForwardShadingEffect.ShadowMapCasterCubeMap",
                        ShadowMapRenderStage = shadowMapCasterCubeMapRenderStage,
                        RenderGroup          = groupMask
                    },
                    new MeshTransparentRenderStageSelector()
                    {
                        EffectName        = "XenkoForwardShadingEffect.ShadowMapCaster",
                        OpaqueRenderStage = gBuffer,
                        RenderGroup       = groupMask
                    }
                }
            };

            var spriteRenderFeature = new SpriteRenderFeature()
            {
                RenderStageSelectors =
                {
                    new SpriteTransparentRenderStageSelector()
                    {
                        EffectName             = "Test", // TODO: Check this
                        OpaqueRenderStage      = opaqueRenderStage,
                        TransparentRenderStage = transparentRenderStage,
                        RenderGroup            = groupMask
                    }
                }
            };

            var backgroundRenderFeature = new BackgroundRenderFeature()
            {
                RenderStageSelectors =
                {
                    new SimpleGroupToRenderStageSelector()
                    {
                        EffectName  = "Test",
                        RenderStage = opaqueRenderStage,
                        RenderGroup = groupMask
                    }
                }
            };

            var uiRenderFeature = new UIRenderFeature()
            {
                RenderStageSelectors =
                {
                    new SimpleGroupToRenderStageSelector()
                    {
                        EffectName  = "Test",
                        RenderStage = transparentRenderStage,
                        RenderGroup = groupMask
                    }
                }
            };

            var particleEmitterRenderFeature = new ParticleEmitterRenderFeature()
            {
                RenderStageSelectors =
                {
                    new ParticleEmitterTransparentRenderStageSelector()
                    {
                        OpaqueRenderStage      = opaqueRenderStage,
                        TransparentRenderStage = transparentRenderStage,
                        RenderGroup            = groupMask
                    }
                }
            };

            //TODO: add that when in VL Context (needs VL.Xenko nuget)
            //var vlLayerRenderfeature = new LayerRenderFeature()
            //{
            //    RenderStageSelectors =
            //    {
            //        new SimpleGroupToRenderStageSelector()
            //        {
            //            RenderStage = opaqueRenderStage,
            //            RenderGroup = groupMask
            //        }
            //    }

            //};
            #endregion

            #region Camera slots
            var offscreenCameraSlot = new SceneCameraSlot();
            if (camera != null)
            {
                camera.Slot = offscreenCameraSlot.ToSlotId();
            }
            #endregion

            #region post fx
            var postProcessingEffects = enablePostEffects
                ? new PostProcessingEffects
            {
                ColorTransforms =
                {
                    Transforms =
                    {
                        new ToneMap(),
                    },
                },
            }
                : null;

            if (postProcessingEffects != null)
            {
                postProcessingEffects.DisableAll();
                postProcessingEffects.ColorTransforms.Enabled = true;
            }
            #endregion

            #region Renderers
            var forwardRenderer = new ForwardRenderer
            {
                Clear = { ClearFlags = ClearRendererFlags.ColorAndDepth, Color = new Color4(0, 0, 0, 0) },
                GBufferRenderStage = gBuffer,
                LightProbes        = true,
                MSAALevel          = MultisampleCount.None,
                //MSAAResolver = new MSAAResolver() { FilterType = MSAAResolver.FilterTypes.BSpline, FilterRadius = 1.0f },
                OpaqueRenderStage     = opaqueRenderStage,
                ShadowMapRenderStages = { shadowMapCaster },
                //SubsurfaceScatteringBlurEffect,
                TransparentRenderStage = transparentRenderStage,
                // TODO: add postFX once their alpha is sorted out
                PostEffects = postProcessingEffects
            };

            var singleViewforwardRenderer = new ForwardRenderer
            {
                Clear = { ClearFlags = ClearRendererFlags.ColorAndDepth, Color = new Color4(0, 0, 0, 0) },
                GBufferRenderStage = gBuffer,
                LightProbes        = true,
                MSAALevel          = MultisampleCount.None,
                //MSAAResolver = new MSAAResolver() { FilterType = MSAAResolver.FilterTypes.BSpline, FilterRadius = 1.0f },
                OpaqueRenderStage     = opaqueRenderStage,
                ShadowMapRenderStages = { shadowMapCaster },
                //SubsurfaceScatteringBlurEffect,
                TransparentRenderStage = transparentRenderStage
            };
            #endregion

            #region Game
            var game = new SceneCameraRenderer()
            {
                Camera = offscreenCameraSlot,
                Child  = new RenderTextureSceneRenderer()
                {
                    RenderTexture = renderTarget,
                    Child         = forwardRenderer,
                }
            };
            #endregion

            return(new GraphicsCompositor
            {
                Cameras = { offscreenCameraSlot },

                RenderStages =
                {
                    opaqueRenderStage,
                    transparentRenderStage,
                    shadowMapCaster,
                    shadowMapCasterrParaboloidRenderStage,
                    shadowMapCasterCubeMapRenderStage,
                    gBuffer
                },
                RenderFeatures =
                {
                    meshRenderFeature,
                    spriteRenderFeature,
                    backgroundRenderFeature,
                    uiRenderFeature,
                    particleEmitterRenderFeature,
                    //vlLayerRenderfeature
                },

                Game = game
            });
        }
        public static GraphicsCompositor GetFirstForwardRenderer(this GraphicsCompositor compositor, out ForwardRenderer forwardRenderer)
        {
            var topChildRenderer = ((SceneCameraRenderer)compositor.Game).Child;

            forwardRenderer = (topChildRenderer as SceneRendererCollection)?.Children.OfType <ForwardRenderer>().FirstOrDefault() ?? (ForwardRenderer)topChildRenderer;
            return(compositor);
        }