예제 #1
0
 public static bool Contains(this RenderGroupMask mask, RenderGroup group)
 {
     return(((uint)mask & (1 << (int)group)) != 0);
 }
예제 #2
0
        /// <summary>
        /// Creates a typical graphics compositor programatically. It can render meshes, sprites and backgrounds.
        /// </summary>
        public static GraphicsCompositor CreateDefault(bool enablePostEffects, string modelEffectName = "XenkoForwardShadingEffect", CameraComponent camera = null, Color4?clearColor = null, GraphicsProfile graphicsProfile = GraphicsProfile.Level_10_0, RenderGroupMask groupMask = RenderGroupMask.All)
        {
            var opaqueRenderStage = new RenderStage("Opaque", "Main")
            {
                SortMode = new StateChangeSortMode()
            };
            var transparentRenderStage = new RenderStage("Transparent", "Main")
            {
                SortMode = new BackToFrontSortMode()
            };
            var shadowCasterRenderStage = new RenderStage("ShadowMapCaster", "ShadowMapCaster")
            {
                SortMode = new FrontToBackSortMode()
            };
            var shadowCasterCubeMapRenderStage = new RenderStage("ShadowMapCasterCubeMap", "ShadowMapCasterCubeMap")
            {
                SortMode = new FrontToBackSortMode()
            };
            var shadowCasterParaboloidRenderStage = new RenderStage("ShadowMapCasterParaboloid", "ShadowMapCasterParaboloid")
            {
                SortMode = new FrontToBackSortMode()
            };

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

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

            var singleView = new ForwardRenderer
            {
                Clear                  = { Color = clearColor ?? Color.CornflowerBlue },
                OpaqueRenderStage      = opaqueRenderStage,
                TransparentRenderStage = transparentRenderStage,
                ShadowMapRenderStages  = { shadowCasterRenderStage, shadowCasterParaboloidRenderStage, shadowCasterCubeMapRenderStage },
                PostEffects            = postProcessingEffects,
            };

            var forwardLighting = graphicsProfile >= GraphicsProfile.Level_10_0
                ? new ForwardLightingRenderFeature
            {
                LightRenderers =
                {
                    new LightAmbientRenderer(),
                    new LightSkyboxRenderer(),
                    new LightDirectionalGroupRenderer(),
                    new LightPointGroupRenderer(),
                    new LightSpotGroupRenderer(),
                    new LightClusteredPointSpotGroupRenderer(),
                },
                ShadowMapRenderer = new ShadowMapRenderer
                {
                    Renderers =
                    {
                        new LightDirectionalShadowMapRenderer
                        {
                            ShadowCasterRenderStage = shadowCasterRenderStage
                        },
                        new LightSpotShadowMapRenderer
                        {
                            ShadowCasterRenderStage = shadowCasterRenderStage
                        },
                        new LightPointShadowMapRendererParaboloid
                        {
                            ShadowCasterRenderStage = shadowCasterParaboloidRenderStage
                        },
                        new LightPointShadowMapRendererCubeMap
                        {
                            ShadowCasterRenderStage = shadowCasterCubeMapRenderStage
                        },
                    },
                },
            }
                : new ForwardLightingRenderFeature
            {
                LightRenderers =
                {
                    new LightAmbientRenderer(),
                    new LightDirectionalGroupRenderer(),
                    new LightSkyboxRenderer(),
                    new LightPointGroupRenderer(),
                    new LightSpotGroupRenderer(),
                },
            };

            var cameraSlot = new SceneCameraSlot();

            if (camera != null)
            {
                camera.Slot = cameraSlot.ToSlotId();
            }

            return(new GraphicsCompositor
            {
                Cameras =
                {
                    cameraSlot
                },
                RenderStages =
                {
                    opaqueRenderStage,
                    transparentRenderStage,
                    shadowCasterRenderStage,
                    shadowCasterParaboloidRenderStage,
                    shadowCasterCubeMapRenderStage,
                },
                RenderFeatures =
                {
                    new MeshRenderFeature
                    {
                        RenderFeatures =
                        {
                            new TransformRenderFeature(),
                            new SkinningRenderFeature(),
                            new MaterialRenderFeature(),
                            new ShadowCasterRenderFeature(),
                            forwardLighting,
                        },
                        RenderStageSelectors =
                        {
                            new MeshTransparentRenderStageSelector
                            {
                                EffectName = modelEffectName,
                                OpaqueRenderStage = opaqueRenderStage,
                                TransparentRenderStage = transparentRenderStage,
                                RenderGroup = groupMask
                            },
                            new ShadowMapRenderStageSelector
                            {
                                EffectName = modelEffectName + ".ShadowMapCaster",
                                ShadowMapRenderStage = shadowCasterRenderStage,
                                RenderGroup = groupMask
                            },
                            new ShadowMapRenderStageSelector
                            {
                                EffectName = modelEffectName + ".ShadowMapCasterParaboloid",
                                ShadowMapRenderStage = shadowCasterParaboloidRenderStage,
                                RenderGroup = groupMask
                            },
                            new ShadowMapRenderStageSelector
                            {
                                EffectName = modelEffectName + ".ShadowMapCasterCubeMap",
                                ShadowMapRenderStage = shadowCasterCubeMapRenderStage,
                                RenderGroup = groupMask
                            },
                        },
                        PipelineProcessors =
                        {
                            new MeshPipelineProcessor       {
                                TransparentRenderStage = transparentRenderStage
                            },
                            new ShadowMeshPipelineProcessor {
                                ShadowMapRenderStage = shadowCasterRenderStage
                            },
                            new ShadowMeshPipelineProcessor {
                                ShadowMapRenderStage = shadowCasterParaboloidRenderStage, DepthClipping = true
                            },
                            new ShadowMeshPipelineProcessor {
                                ShadowMapRenderStage = shadowCasterCubeMapRenderStage, DepthClipping = true
                            },
                        }
                    },
                    new SpriteRenderFeature
                    {
                        RenderStageSelectors =
                        {
                            new SpriteTransparentRenderStageSelector
                            {
                                EffectName = "Test",
                                OpaqueRenderStage = opaqueRenderStage,
                                TransparentRenderStage = transparentRenderStage,
                                RenderGroup = groupMask
                            }
                        },
                    },
                    new BackgroundRenderFeature
                    {
                        RenderStageSelectors =
                        {
                            new SimpleGroupToRenderStageSelector
                            {
                                RenderStage = opaqueRenderStage,
                                EffectName = "Test",
                                RenderGroup = groupMask
                            }
                        },
                    },
                },
                Game = new SceneCameraRenderer()
                {
                    Child = singleView,
                    Camera = cameraSlot
                },
                Editor = singleView,
                SingleView = singleView,
            });
        }
예제 #3
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
            });
        }