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); }
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); }
public Scene(TextWriter writer, ISceneRenderer renderer) : this(renderer) { if (writer != null) { Console.SetOut(writer); } }
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(); }
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); } }
/// <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(); }
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 }; }
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); } } }
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); }
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); } } }
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); }
// Use this for initialization private void Awake() { this._sceneRenderer = this.GetComponent <ISceneRenderer>(); }
public static IEngine BuildEngine(EngineOptions options, IController controller, IEventsCycle eventsCycle, ISceneRenderer sceneRenderer) { return(Engine.Create(options, controller, eventsCycle, sceneRenderer)); }
public void RemoveFromRenderer(ISceneRenderer sceneRenderer) { sceneRenderer.SceneRendered -= this.ApplyMeshData; }
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}"); }
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)); }
public Scene(ISceneRenderer renderer) { this.Figures = new Dictionary<string, IFigure>(); this.CompositeFigures = new Dictionary<string, ICompositeFigure>(); this.renderer = renderer; }
/// <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(); }
/// <summary> /// Adds the specified scene renderer. /// </summary> /// <param name="sceneRenderer">The scene renderer.</param> public void Add(ISceneRenderer sceneRenderer) { Renderers.Add(sceneRenderer); }
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; }
/// <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 }
public void Return(ISceneRenderer pipeline) { reserve.Add(pipeline); }
/// <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 }