Ejemplo n.º 1
0
        private VRRendererSettings findVRSettings(ISceneRenderer r)
        {
            if (r is ForwardRenderer fr)
            {
                return(fr.VRSettings);
            }
            else if (r is SceneCameraRenderer scr)
            {
                return(findVRSettings(scr.Child));
            }
            else if (r is SceneRendererCollection src)
            {
                VRRendererSettings vrs;
                foreach (ISceneRenderer isr in src.Children)
                {
                    vrs = findVRSettings(isr);
                    if (vrs != null)
                    {
                        return(vrs);
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 2
0
        public CubemapSceneRenderer(ISceneRendererContext context, int textureSize)
        {
            this.context = context;

            Camera = new CameraComponent
            {
                UseCustomProjectionMatrix = true,
                UseCustomViewMatrix       = true,
            };

            // Replace graphics compositor (don't want post fx, etc...)
            gameCompositor = context.SceneSystem.GraphicsCompositor.Game;
            context.SceneSystem.GraphicsCompositor.Game = new SceneExternalCameraRenderer {
                Child = context.SceneSystem.GraphicsCompositor.SingleView, ExternalCamera = Camera
            };

            // Setup projection matrix
            Camera.ProjectionMatrix = Matrix.PerspectiveFovRH(MathUtil.DegreesToRadians(90.0f), 1.0f, Camera.NearClipPlane, Camera.FarClipPlane);

            var renderContext = RenderContext.GetShared(context.Services);

            DrawContext = new RenderDrawContext(context.Services, renderContext, context.GraphicsContext);

            // We can't render directly to the texture cube before feature level 10.1, so let's render to a standard render target and copy instead
            renderTarget = Texture.New2D(context.GraphicsDevice, textureSize, textureSize, PixelFormat.R16G16B16A16_Float, TextureFlags.RenderTarget);
            depthStencil = Texture.New2D(context.GraphicsDevice, textureSize, textureSize, PixelFormat.D24_UNorm_S8_UInt, TextureFlags.DepthStencil);
        }
Ejemplo n.º 3
0
 public Scene(TextWriter writer, ISceneRenderer renderer)
     : this(renderer)
 {
     if (writer != null)
     {
         Console.SetOut(writer);
     }
 }
Ejemplo n.º 4
0
 public void HandleDeviceReset()
 {
     InizializeDevice();
     Resize(InitialWidth, InitialHeight);
     _sceneRenderer           = new SceneGeometryRenderer(_device);
     _start                   = new AgentRenderer(_device);
     _destination             = new AgentRenderer(_device);
     _start.AgentRadius       = 0.6f;
     _destination.AgentRadius = 0.6f;
     PopulateNavMeshRenderers();
 }
Ejemplo n.º 5
0
 private void CreateRenderingBackend()
 {
     Debug.Assert(_renderer == null);
     if (GraphicsSettings.Default.RenderingBackend == 0)
     {
         _mapper   = new MaterialMapperClassicGl(this);
         _renderer = new SceneRendererClassicGl(this, _sceneMin, _sceneMax);
     }
     else
     {
         _mapper   = new MaterialMapperModernGl(this);
         _renderer = new SceneRendererModernGl(this, _sceneMin, _sceneMax);
     }
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Recreates the rendering backend if needed. This is called after the
        /// global rendering backend setting is changed.
        /// </summary>
        public void RecreateRenderingBackend()
        {
            if (_renderer != null)
            {
                _renderer.Dispose();
                _renderer = null;
            }

            if (_mapper != null)
            {
                _mapper.Dispose();
                _mapper = null;
            }
            CreateRenderingBackend();
        }
Ejemplo n.º 7
0
        public CubemapSceneRenderer(ISceneRendererContext context, int textureSize)
            : base(context.GraphicsDevice, textureSize, PixelFormat.R16G16B16A16_Float, true)
        {
            this.context = context;

            var renderContext = RenderContext.GetShared(context.Services);

            DrawContext = new RenderDrawContext(context.Services, renderContext, context.GraphicsContext);

            // Replace graphics compositor (don't want post fx, etc...)
            gameCompositor = context.SceneSystem.GraphicsCompositor.Game;
            context.SceneSystem.GraphicsCompositor.Game = new SceneExternalCameraRenderer {
                Child = context.SceneSystem.GraphicsCompositor.SingleView, ExternalCamera = Camera
            };
        }
Ejemplo n.º 8
0
 private void recursiveVRSet(ISceneRenderer r, bool enable)
 {
     if (r is ForwardRenderer fr)
     {
         fr.VRSettings.Enabled = enable && fr.VRSettings.RequiredApis.Count > 0;
     }
     else if (r is SceneCameraRenderer scr)
     {
         recursiveVRSet(scr.Child, enable);
     }
     else if (r is SceneRendererCollection src)
     {
         foreach (ISceneRenderer isr in src.Children)
         {
             recursiveVRSet(isr, enable);
         }
     }
 }
Ejemplo n.º 9
0
        private Engine(
            IScreen screen,
            IController controller,
            IEventsCycle eventsCycle,
            ISceneRenderer sceneRenderer,
            IMiniMapRenderer miniMapRenderer,
            IStatusBarRenderer statusBarRenderer,
            ITextRenderer textRenderer)
        {
            Screen                 = screen;
            Controller             = controller;
            EventsCycle            = eventsCycle;
            this.sceneRenderer     = sceneRenderer;
            this.miniMapRenderer   = miniMapRenderer;
            this.statusBarRenderer = statusBarRenderer;
            this.textRenderer      = textRenderer;

            previousTime     = SDL_GetPerformanceCounter();
            counterFrequency = SDL_GetPerformanceFrequency() / 1000.0f;

            eventsCycle.AddListener(controller);
        }
Ejemplo n.º 10
0
 private void gatherPostProcessors(ISceneRenderer renderer)
 {
     if (renderer is SceneCameraRenderer scr)
     {
         gatherPostProcessors(scr.Child);
     }
     else if (renderer is SceneRendererCollection src)
     {
         List <ISceneRenderer> renderers = src.Children;
         for (int i = 0; i < renderers.Count; i++)
         {
             gatherPostProcessors(renderers[i]);
         }
     }
     else if (renderer is ForwardRenderer fr)
     {
         IPostProcessingEffects check = fr.PostEffects;
         if (check != null && check is PostProcessingEffects c)
         {
             cachedProcessor.Add(c);
         }
     }
 }
Ejemplo n.º 11
0
        public bool Start(Simian simian)
        {
            m_scheduler = simian.GetAppModule <IScheduler>();
            if (m_scheduler == null)
            {
                m_log.Error("LLSceneFactory requires an IScheduler");
                return(false);
            }

            m_scenes = new Dictionary <UUID, IScene>();

            m_renderer   = simian.GetAppModule <ISceneRenderer>();
            m_gridClient = simian.GetAppModule <IGridClient>();

            string[] sceneFiles = null;

            try { sceneFiles = Directory.GetFiles(SOURCE_PATH, "*.ini", SearchOption.AllDirectories); }
            catch (DirectoryNotFoundException)
            {
                m_log.Warn(Path.GetFullPath(SOURCE_PATH) + " not found, cannot load scene definitions");
                return(false);
            }

            for (int i = 0; i < sceneFiles.Length; i++)
            {
                // Create the config source for this region by merging the app config and the region config
                IConfigSource   configSource       = simian.GetConfigCopy();
                IniConfigSource regionConfigSource = new IniConfigSource(sceneFiles[i]);
                configSource.Merge(regionConfigSource);

                IConfig config = configSource.Configs["LindenRegion"];

                if (config != null)
                {
                    UUID id;
                    UUID.TryParse(config.GetString("ID"), out id);

                    string name = config.GetString("Name");

                    uint     locationX = 0, locationY = 0;
                    string[] locationParts = config.GetString("Location").Trim().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    if (locationParts.Length != 2 || !UInt32.TryParse(locationParts[0], out locationX) || !UInt32.TryParse(locationParts[1], out locationY))
                    {
                        m_log.Warn("Missing or invalid Location for " + name + " region");
                    }
                    Vector3d regionPosition = new Vector3d(locationX * (uint)REGION_SIZE, locationY * (uint)REGION_SIZE, 0.0d);

                    Scene scene = new Scene(id, name, regionPosition, new Vector3d(256.0, 256.0, 4096.0), simian, configSource);
                    m_log.Info("Starting scene " + scene.Name + " (" + scene.ID + ")");
                    scene.Start();

                    m_scenes[scene.ID] = scene;

                    // Create a map tile for this scene
                    m_scheduler.FireAndForget(o => CreateMapTile((IScene)o), scene);
                }
                else
                {
                    m_log.Warn("No [LindenRegion] config section found in " + sceneFiles[i] + ", skipping");
                }
            }

            // Create the array
            m_scenesArray = new IScene[m_scenes.Count];
            int j = 0;

            foreach (IScene scene in m_scenes.Values)
            {
                m_scenesArray[j++] = scene;
            }

            // Fire the OnSceneStart callback for each scene we started
            SceneStartCallback callback = OnSceneStart;

            if (callback != null)
            {
                for (int i = 0; i < m_scenesArray.Length; i++)
                {
                    callback(m_scenesArray[i]);
                }
            }

            return(true);
        }
Ejemplo n.º 12
0
 // Use this for initialization
 private void Awake()
 {
     this._sceneRenderer = this.GetComponent <ISceneRenderer>();
 }
Ejemplo n.º 13
0
 public static IEngine BuildEngine(EngineOptions options, IController controller, IEventsCycle eventsCycle, ISceneRenderer sceneRenderer)
 {
     return(Engine.Create(options, controller, eventsCycle, sceneRenderer));
 }
Ejemplo n.º 14
0
 public void RemoveFromRenderer(ISceneRenderer sceneRenderer)
 {
     sceneRenderer.SceneRendered -= this.ApplyMeshData;
 }
Ejemplo n.º 15
0
 public void AddToRenderer(ISceneRenderer sceneRenderer)
 {
     sceneRenderer.SceneRendered += this.ApplyMeshData;
 }
 public MultiagentModelingEngine(ModelingEngineConfiguration configuration, ISceneRenderer sceneRenderer)
 {
     Configuration = configuration ?? throw new ArgumentNullException($"{configuration}");
     SceneRenderer = sceneRenderer ?? throw new ArgumentNullException($"{sceneRenderer}");
 }
Ejemplo n.º 17
0
        public static Engine Create(EngineOptions options, IController controller, IEventsCycle eventsCycle,
                                    ISceneRenderer sceneRenderer)
        {
            if (SDL_Init(SDL_INIT_VIDEO) < 0)
            {
                throw new InvalidOperationException($"Cant initialize SDL2: {SDL_GetError()}");
            }

            if (SDL_image.IMG_Init(SDL_image.IMG_InitFlags.IMG_INIT_JPG | SDL_image.IMG_InitFlags.IMG_INIT_PNG) < 0)
            {
                throw new InvalidOperationException($"Cant initialize SDL_image: {SDL_GetError()}");
            }

            if (SDL_ttf.TTF_Init() < 0)
            {
                throw new InvalidOperationException($"TTF_Init: {SDL_GetError()}");
            }

            if (SDL_ShowCursor(0) < 0)
            {
                throw new InvalidOperationException($"Cant disable cursor: {SDL_GetError()}");
            }

            if (SDL_mixer.Mix_Init(
                    SDL_mixer.MIX_InitFlags.MIX_INIT_MP3
                    | SDL_mixer.MIX_InitFlags.MIX_INIT_MID
                    | SDL_mixer.MIX_InitFlags.MIX_INIT_MOD
                    | SDL_mixer.MIX_InitFlags.MIX_INIT_OGG
                    | SDL_mixer.MIX_InitFlags.MIX_INIT_FLAC
                    | SDL_mixer.MIX_InitFlags.MIX_INIT_OPUS) < 0)
            {
                throw new InvalidOperationException($"MixInit: {SDL_GetError()}");
            }

            if (SDL_mixer.Mix_OpenAudio(22050, SDL_mixer.MIX_DEFAULT_FORMAT, 2, 4096) < 0)
            {
                throw new InvalidOperationException($"OpenAudio: {SDL_GetError()}");
            }

            if (SDL_mixer.Mix_AllocateChannels(16) < 0)
            {
                throw new InvalidOperationException($"Cant allocate channels: {SDL_GetError()}");
            }

            if (SDL_mixer.Mix_Volume(-1, 64) < 0)
            {
                throw new InvalidOperationException($"Min_Volume: {SDL_GetError()}");
            }


            var screen = Ui.Screen.Create(options.WindowTitle, options.ScreenHeight, options.ScreenWidth,
                                          options.FullScreen);
            var miniMapRenderer       = new MiniMapRenderer();
            var statusBarHeight       = screen.Height / 8;
            var statusBarWidth        = screen.Width;
            var statusBarSprite       = Sprite.Load(UiResourcesHelper.StatusBarSpritePath);
            var bowSprite             = Sprite.Load(UiResourcesHelper.BowMiniSpritePath);
            var frameSprite           = Sprite.Load(UiResourcesHelper.FrameSpritePath);
            var crossSprite           = options.CrossSpritePath == null ? null : Sprite.Load(options.CrossSpritePath);
            var arrowSprite           = Sprite.Load(UiResourcesHelper.ArrowSpritePath);
            var swordSprite           = Sprite.Load(UiResourcesHelper.SwordSpritePath);
            var fireBallSprite        = Sprite.Load(UiResourcesHelper.FireBallSpritePath);
            var shockBallSprite       = Sprite.Load(UiResourcesHelper.ShockBallSpritePath);
            var faceSprite            = Sprite.Load(UiResourcesHelper.FaceSprintPath);
            var faceHurtedSprite      = Sprite.Load(UiResourcesHelper.FaceHurtedSpritePath);
            var faceBadSprite         = Sprite.Load(UiResourcesHelper.FaceBadSpritePath);
            var logTextRenderer       = TextRenderer.Load(options.FontPath, screen.Height / 50);
            var notesTextRenderer     = TextRenderer.Load(options.FontPath, screen.Height / 50);
            var statusTextRenderer    = TextRenderer.Load(options.FontPath, screen.Height / 20);
            var notesRenderer         = new NotesRenderer(Sprite.Load(options.NotesSpritePath), notesTextRenderer, statusBarHeight);
            var monologueTextRenderer = TextRenderer.Load(options.FontPath, screen.Height / 50);
            var monologueRenderer     = new MonologueRenderer(monologueTextRenderer, statusBarHeight);
            var statusBarRenderer     = new StatusRenderer(
                statusBarSprite,
                crossSprite,
                statusBarHeight,
                logTextRenderer,
                notesRenderer,
                monologueRenderer,
                bowSprite,
                swordSprite,
                frameSprite,
                statusTextRenderer,
                arrowSprite,
                fireBallSprite,
                shockBallSprite,
                faceSprite,
                faceHurtedSprite,
                faceBadSprite);
            var textRenderer = options.FontPath == null ? null : TextRenderer.Load(options.FontPath, 24);

            return(new Engine(screen, controller, eventsCycle, sceneRenderer, miniMapRenderer, statusBarRenderer,
                              textRenderer));
        }
Ejemplo n.º 18
0
 public Scene(ISceneRenderer renderer)
 {
     this.Figures = new Dictionary<string, IFigure>();
     this.CompositeFigures = new Dictionary<string, ICompositeFigure>();
     this.renderer = renderer;
 }
Ejemplo n.º 19
0
        /// <summary>
        /// Recreates the rendering backend if needed. This is called after the
        /// global rendering backend setting is changed.
        /// </summary>
        public void RecreateRenderingBackend()
        {
            if(_renderer != null)
            {
                _renderer.Dispose();
                _renderer = null;
            }

            if (_mapper != null)
            {
                _mapper.Dispose();
                _mapper = null;
            }
            CreateRenderingBackend();
        }
Ejemplo n.º 20
0
 /// <summary>
 /// Adds the specified scene renderer.
 /// </summary>
 /// <param name="sceneRenderer">The scene renderer.</param>
 public void Add(ISceneRenderer sceneRenderer)
 {
     Renderers.Add(sceneRenderer);
 }
Ejemplo n.º 21
0
        public bool Start(Simian simian)
        {
            m_scheduler = simian.GetAppModule<IScheduler>();
            if (m_scheduler == null)
            {
                m_log.Error("LLSceneFactory requires an IScheduler");
                return false;
            }

            m_scenes = new Dictionary<UUID, IScene>();

            m_renderer = simian.GetAppModule<ISceneRenderer>();
            m_gridClient = simian.GetAppModule<IGridClient>();

            string[] sceneFiles = null;

            try { sceneFiles = Directory.GetFiles(SOURCE_PATH, "*.ini", SearchOption.AllDirectories); }
            catch (DirectoryNotFoundException)
            {
                m_log.Warn(Path.GetFullPath(SOURCE_PATH) + " not found, cannot load scene definitions");
                return false;
            }

            for (int i = 0; i < sceneFiles.Length; i++)
            {
                // Create the config source for this region by merging the app config and the region config
                IConfigSource configSource = simian.GetConfigCopy();
                IniConfigSource regionConfigSource = new IniConfigSource(sceneFiles[i]);
                configSource.Merge(regionConfigSource);

                IConfig config = configSource.Configs["LindenRegion"];

                if (config != null)
                {
                    UUID id;
                    UUID.TryParse(config.GetString("ID"), out id);

                    string name = config.GetString("Name");

                    uint locationX = 0, locationY = 0;
                    string[] locationParts = config.GetString("Location").Trim().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    if (locationParts.Length != 2 || !UInt32.TryParse(locationParts[0], out locationX) || !UInt32.TryParse(locationParts[1], out locationY))
                    {
                        m_log.Warn("Missing or invalid Location for " + name + " region");
                    }
                    Vector3d regionPosition = new Vector3d(locationX * (uint)REGION_SIZE, locationY * (uint)REGION_SIZE, 0.0d);

                    Scene scene = new Scene(id, name, regionPosition, new Vector3d(256.0, 256.0, 4096.0), simian, configSource);
                    m_log.Info("Starting scene " + scene.Name + " (" + scene.ID + ")");
                    scene.Start();

                    m_scenes[scene.ID] = scene;

                    // Create a map tile for this scene
                    m_scheduler.FireAndForget(o => CreateMapTile((IScene)o), scene);
                }
                else
                {
                    m_log.Warn("No [LindenRegion] config section found in " + sceneFiles[i] + ", skipping");
                }
            }

            // Create the array
            m_scenesArray = new IScene[m_scenes.Count];
            int j = 0;
            foreach (IScene scene in m_scenes.Values)
                m_scenesArray[j++] = scene;

            // Fire the OnSceneStart callback for each scene we started
            SceneStartCallback callback = OnSceneStart;
            if (callback != null)
            {
                for (int i = 0; i < m_scenesArray.Length; i++)
                {
                    callback(m_scenesArray[i]);
                }
            }

            return true;
        }
Ejemplo n.º 22
0
 /// <summary>
 /// Adds the specified scene renderer.
 /// </summary>
 /// <param name="sceneRenderer">The scene renderer.</param>
 public void Add(ISceneRenderer sceneRenderer)
 {
     Renderers.Add(sceneRenderer);
 }
Ejemplo n.º 23
0
        /// <summary>
        ///  见接口
        /// </summary>
        /// <param name="renderer"></param>
        /// <param name="screenTarget"></param>
        public void RenderFullScene(ISceneRenderer renderer, RenderTarget screenTarget, RenderMode mode)
        {
            Microsoft.Xna.Framework.Input.KeyboardState ks = Microsoft.Xna.Framework.Input.Keyboard.GetState();
            if (ks.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.C) &&
                lastState.IsKeyUp(Microsoft.Xna.Framework.Input.Keys.C))
            {
                testMode++;
                if (testMode > TestMode.Blurred)
                    testMode = TestMode.Final;
            }
            lastState = ks;

            if (testMode == TestMode.Original)
            {
                renderer.RenderScene(screenTarget, RenderMode.Final);
                return;
            }
            if (testMode == TestMode.Normal)
            {
                renderer.RenderScene(screenTarget, RenderMode.DeferredNormal);
                return;
            }

            renderer.RenderScene(nrmDepthBuffer, RenderMode.DeferredNormal);

            renderer.RenderScene(colorBuffer, RenderMode.Final);


            Viewport vp = renderSys.Viewport;

            ShaderSamplerState sampler1;
            sampler1.AddressU = TextureAddressMode.Clamp;
            sampler1.AddressV = TextureAddressMode.Clamp;
            sampler1.AddressW = TextureAddressMode.Clamp;
            sampler1.BorderColor = ColorValue.Transparent;
            sampler1.MagFilter = TextureFilter.Point;
            sampler1.MaxAnisotropy = 0;
            sampler1.MaxMipLevel = 0;
            sampler1.MinFilter = TextureFilter.Point;
            sampler1.MipFilter = TextureFilter.None;
            sampler1.MipMapLODBias = 0;


            ShaderSamplerState sampler2 = sampler1;
            sampler2.MagFilter = TextureFilter.Linear;
            sampler2.MinFilter = TextureFilter.Linear;

            #region 边缘合成
            renderSys.SetRenderTarget(0, testMode == TestMode.Edge ? screenTarget : edgeResultBuffer);
            edgeEff.Begin();

            edgeEff.SetSamplerStateDirect(0, ref sampler1);
            edgeEff.SetSamplerStateDirect(1, ref sampler1);

            edgeEff.SetTextureDirect(0, nrmDepthBuffer.GetColorBufferTexture());
            edgeEff.SetTextureDirect(1, testMode == TestMode.Edge ? whitePixel : colorBuffer.GetColorBufferTexture());

            Vector2 nrmBufSize = new Vector2(vp.Width, vp.Height);
            edgeEff.SetValue("normalBufferSize", ref nrmBufSize);
            DrawBigQuad();
            edgeEff.End();
            #endregion

            if (testMode == TestMode.Edge)
                return;
            if (testMode == TestMode.Depth)
            {
                renderSys.SetRenderTarget(0, screenTarget);
                depthViewEff.Begin();
                depthViewEff.SetSamplerStateDirect(0, ref sampler1);
                depthViewEff.SetTextureDirect(0, nrmDepthBuffer.GetColorBufferTexture());
                DrawBigQuad();
                depthViewEff.End();
                return;
            }
            #region 高斯X
            renderSys.SetRenderTarget(0, blurredRt1);

            gaussBlur.Begin();

            gaussBlur.SetSamplerStateDirect(0, ref sampler1);
            gaussBlur.SetTextureDirect(0, edgeResultBuffer.GetColorBufferTexture());

            for (int i = 0; i < SampleCount; i++)
            {
                gaussBlur.SetValueDirect(i, ref guassFilter.SampleOffsetsX[i]);
                gaussBlur.SetValueDirect(i + 15, guassFilter.SampleWeights[i]);
            }

            DrawSmallQuad();

            gaussBlur.End();
            #endregion

            #region 高斯Y

            renderSys.SetRenderTarget(0, testMode == TestMode.Blurred ? screenTarget : blurredRt2);
            gaussBlur.Begin();

            gaussBlur.SetSamplerStateDirect(0, ref sampler1);
            gaussBlur.SetTextureDirect(0, blurredRt1.GetColorBufferTexture());

            for (int i = 0; i < SampleCount; i++)
            {
                gaussBlur.SetValueDirect(i, ref guassFilter.SampleOffsetsY[i]);
                gaussBlur.SetValueDirect(i + 15, guassFilter.SampleWeights[i]);
            }
            if (testMode == TestMode.Blurred)
            {
                DrawBigQuad();
            }
            else
            {
                DrawSmallQuad();
            }

            gaussBlur.End();


            #endregion

            if (testMode == TestMode.Blurred)
                return;

            #region DOF合成

            renderSys.SetRenderTarget(0, screenTarget);

            compEff.Begin();

            compEff.SetSamplerStateDirect(0, ref sampler1);
            compEff.SetSamplerStateDirect(1, ref sampler2);
            compEff.SetSamplerStateDirect(2, ref sampler2);

            compEff.SetTextureDirect(0, edgeResultBuffer.GetColorBufferTexture());
            compEff.SetTextureDirect(1, blurredRt2.GetColorBufferTexture());
            compEff.SetTextureDirect(2, nrmDepthBuffer.GetColorBufferTexture());

            //if (camera != null)
            //{
            //    float focNear = (camera.Position.Length() - PlanetEarth.PlanetRadius) / camera.FarPlane;
            //    compEff.SetValue("FocusNear", focNear);
            //}
            //else 
            //{
            //    compEff.SetValue("FocusNear", 0.3f);
            //}

            renderSys.RenderStates.AlphaBlendEnable = true;
            renderSys.RenderStates.SourceBlend = Blend.SourceAlpha;
            renderSys.RenderStates.DestinationBlend = Blend.InverseSourceAlpha;
            renderSys.RenderStates.BlendOperation = BlendFunction.Add;

            DrawBigQuad();

            compEff.End();
            #endregion
        }
Ejemplo n.º 24
0
 private void CreateRenderingBackend()
 {
     Debug.Assert(_renderer == null);
     if (GraphicsSettings.Default.RenderingBackend == 0)
     {
         _mapper = new MaterialMapperClassicGl(this);
         _renderer = new SceneRendererClassicGl(this, _sceneMin, _sceneMax);
     }
     else
     {
         _mapper = new MaterialMapperModernGl(this);
         _renderer = new SceneRendererModernGl(this, _sceneMin, _sceneMax);
     }
 }
Ejemplo n.º 25
0
 public void Return(ISceneRenderer pipeline)
 {
     reserve.Add(pipeline);
 }
Ejemplo n.º 26
0
        /// <summary>
        ///  见接口
        /// </summary>
        /// <param name="renderer"></param>
        /// <param name="screenTarget"></param>
        public void RenderFullScene(ISceneRenderer renderer, RenderTarget screenTarget, RenderMode mode)
        {
            Microsoft.Xna.Framework.Input.KeyboardState ks = Microsoft.Xna.Framework.Input.Keyboard.GetState();
            if (ks.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.C) &&
                lastState.IsKeyUp(Microsoft.Xna.Framework.Input.Keys.C))
            {
                testMode++;
                if (testMode > TestMode.Blurred)
                {
                    testMode = TestMode.Final;
                }
            }
            lastState = ks;

            if (testMode == TestMode.Original)
            {
                renderer.RenderScene(screenTarget, RenderMode.Final);
                return;
            }
            if (testMode == TestMode.Normal)
            {
                renderer.RenderScene(screenTarget, RenderMode.DeferredNormal);
                return;
            }

            renderer.RenderScene(nrmDepthBuffer, RenderMode.DeferredNormal);

            renderer.RenderScene(colorBuffer, RenderMode.Final);


            Viewport vp = renderSys.Viewport;

            ShaderSamplerState sampler1;

            sampler1.AddressU      = TextureAddressMode.Clamp;
            sampler1.AddressV      = TextureAddressMode.Clamp;
            sampler1.AddressW      = TextureAddressMode.Clamp;
            sampler1.BorderColor   = ColorValue.Transparent;
            sampler1.MagFilter     = TextureFilter.Point;
            sampler1.MaxAnisotropy = 0;
            sampler1.MaxMipLevel   = 0;
            sampler1.MinFilter     = TextureFilter.Point;
            sampler1.MipFilter     = TextureFilter.None;
            sampler1.MipMapLODBias = 0;


            ShaderSamplerState sampler2 = sampler1;

            sampler2.MagFilter = TextureFilter.Linear;
            sampler2.MinFilter = TextureFilter.Linear;

            #region 边缘合成
            renderSys.SetRenderTarget(0, testMode == TestMode.Edge ? screenTarget : edgeResultBuffer);
            edgeEff.Begin();

            edgeEff.SetSamplerStateDirect(0, ref sampler1);
            edgeEff.SetSamplerStateDirect(1, ref sampler1);

            edgeEff.SetTextureDirect(0, nrmDepthBuffer.GetColorBufferTexture());
            edgeEff.SetTextureDirect(1, testMode == TestMode.Edge ? whitePixel : colorBuffer.GetColorBufferTexture());

            Vector2 nrmBufSize = new Vector2(vp.Width, vp.Height);
            edgeEff.SetValue("normalBufferSize", ref nrmBufSize);
            DrawBigQuad();
            edgeEff.End();
            #endregion

            if (testMode == TestMode.Edge)
            {
                return;
            }
            if (testMode == TestMode.Depth)
            {
                renderSys.SetRenderTarget(0, screenTarget);
                depthViewEff.Begin();
                depthViewEff.SetSamplerStateDirect(0, ref sampler1);
                depthViewEff.SetTextureDirect(0, nrmDepthBuffer.GetColorBufferTexture());
                DrawBigQuad();
                depthViewEff.End();
                return;
            }
            #region 高斯X
            renderSys.SetRenderTarget(0, blurredRt1);

            gaussBlur.Begin();

            gaussBlur.SetSamplerStateDirect(0, ref sampler1);
            gaussBlur.SetTextureDirect(0, edgeResultBuffer.GetColorBufferTexture());

            for (int i = 0; i < SampleCount; i++)
            {
                gaussBlur.SetValueDirect(i, ref guassFilter.SampleOffsetsX[i]);
                gaussBlur.SetValueDirect(i + 15, guassFilter.SampleWeights[i]);
            }

            DrawSmallQuad();

            gaussBlur.End();
            #endregion

            #region 高斯Y

            renderSys.SetRenderTarget(0, testMode == TestMode.Blurred ? screenTarget : blurredRt2);
            gaussBlur.Begin();

            gaussBlur.SetSamplerStateDirect(0, ref sampler1);
            gaussBlur.SetTextureDirect(0, blurredRt1.GetColorBufferTexture());

            for (int i = 0; i < SampleCount; i++)
            {
                gaussBlur.SetValueDirect(i, ref guassFilter.SampleOffsetsY[i]);
                gaussBlur.SetValueDirect(i + 15, guassFilter.SampleWeights[i]);
            }
            if (testMode == TestMode.Blurred)
            {
                DrawBigQuad();
            }
            else
            {
                DrawSmallQuad();
            }

            gaussBlur.End();


            #endregion

            if (testMode == TestMode.Blurred)
            {
                return;
            }

            #region DOF合成

            renderSys.SetRenderTarget(0, screenTarget);

            compEff.Begin();

            compEff.SetSamplerStateDirect(0, ref sampler1);
            compEff.SetSamplerStateDirect(1, ref sampler2);
            compEff.SetSamplerStateDirect(2, ref sampler2);

            compEff.SetTextureDirect(0, edgeResultBuffer.GetColorBufferTexture());
            compEff.SetTextureDirect(1, blurredRt2.GetColorBufferTexture());
            compEff.SetTextureDirect(2, nrmDepthBuffer.GetColorBufferTexture());

            //if (camera != null)
            //{
            //    float focNear = (camera.Position.Length() - PlanetEarth.PlanetRadius) / camera.FarPlane;
            //    compEff.SetValue("FocusNear", focNear);
            //}
            //else
            //{
            //    compEff.SetValue("FocusNear", 0.3f);
            //}

            renderSys.RenderStates.AlphaBlendEnable = true;
            renderSys.RenderStates.SourceBlend      = Blend.SourceAlpha;
            renderSys.RenderStates.DestinationBlend = Blend.InverseSourceAlpha;
            renderSys.RenderStates.BlendOperation   = BlendFunction.Add;

            DrawBigQuad();

            compEff.End();
            #endregion
        }