public void DrawScene(GameTime gameTime, IWorld world, RenderHelper render, GraphicInfo ginfo, List <IObject> objectsToDraw) { render.ValidateSamplerStates(); Matrix view = world.CameraManager.ActiveCamera.View; Matrix projection = world.CameraManager.ActiveCamera.Projection; if (render.RenderPreComponents(gameTime, ref view, ref projection) > 0) { render.SetSamplerStates(ginfo.SamplerState); } System.Diagnostics.Debug.Assert(render.PeekBlendState() == BlendState.Opaque); System.Diagnostics.Debug.Assert(render.PeekDepthState() == DepthStencilState.Default); System.Diagnostics.Debug.Assert(render.PeekRasterizerState() == RasterizerState.CullCounterClockwise); render.DettachBindedTextures(5); foreach (IObject item in objectsToDraw) { if (item.Material.IsVisible) { item.Material.Drawn(gameTime, item, world.CameraManager.ActiveCamera, world.Lights, render); } } render.ValidateSamplerStates(); }
public void DrawLights(GameTime gameTime, IWorld world, IDeferredGBuffer deferredGBuffer, RenderHelper render) { render.Clear(Color.Transparent, ClearOptions.Target); foreach (ILight light in world.Lights.Where((a) => a.CastShadown == true && a.Enabled == true)) { switch (light.LightType) { case LightType.Deferred_Directional: DirectionalLightPE dl = light as DirectionalLightPE; shadowMap = shadow.Render(gameTime, render, ginfo, dl, world.CameraManager.ActiveCamera, world, deferredGBuffer); render.PushBlendState(_lightAddBlendState); DrawDirectionalLight(render, ginfo, world.CameraManager.ActiveCamera, dl, deferredGBuffer); render.PopBlendState(); break; case LightType.Deferred_Point: #if WINDOWS System.Diagnostics.Debug.Fail("Point Light Shadow not supported, in production no error will be created, the light just wont cast any shadow"); #endif render.PushBlendState(_lightAddBlendState); DrawPointLight(render, ginfo, world.CameraManager.ActiveCamera, light as PointLightPE, deferredGBuffer, true); render.PopBlendState(); break; case LightType.Deferred_Spot: SpotLightPE sl = light as SpotLightPE; Matrix v = sl.ViewMatrix; Matrix p =sl.ProjMatrix; RenderShadowMap(gameTime, render, ref v, ref p, world, deferredGBuffer); render.PushBlendState(_lightAddBlendState); DrawnSpotLight(render, ginfo, world.CameraManager.ActiveCamera, sl, deferredGBuffer); render.PopBlendState(); break; default: throw new Exception("Light type Unexpected"); } } render.DettachBindedTextures(); render.SetSamplerStates(ginfo.SamplerState); render.PushBlendState(_lightAddBlendState); foreach (ILight light in world.Lights.Where((a) => a.CastShadown != true && a.Enabled == true)) { switch (light.LightType) { case LightType.Deferred_Directional: DirectionalLightPE dl = light as DirectionalLightPE; DrawDirectionalLight(render,ginfo, world.CameraManager.ActiveCamera, dl, deferredGBuffer); break; case LightType.Deferred_Point: DrawPointLight(render,ginfo, world.CameraManager.ActiveCamera, light as PointLightPE, deferredGBuffer,true); break; case LightType.Deferred_Spot: SpotLightPE sl = light as SpotLightPE; DrawnSpotLight(render,ginfo, world.CameraManager.ActiveCamera, sl, deferredGBuffer); break; default: throw new Exception("Light type Unexpected"); } } render.PopBlendState(); }
public void DrawScene(GameTime gameTime, IWorld world, RenderHelper render, GraphicInfo ginfo, List<IObject> objectsToDraw) { render.ValidateSamplerStates(); Matrix view = world.CameraManager.ActiveCamera.View; Matrix projection = world.CameraManager.ActiveCamera.Projection; if (render.RenderPreComponents(gameTime, ref view, ref projection) > 0) { render.SetSamplerStates(ginfo.SamplerState); } System.Diagnostics.Debug.Assert(render.PeekBlendState() == BlendState.Opaque); System.Diagnostics.Debug.Assert(render.PeekDepthState() == DepthStencilState.Default); System.Diagnostics.Debug.Assert(render.PeekRasterizerState() == RasterizerState.CullCounterClockwise); render.DettachBindedTextures(5); foreach (IObject item in objectsToDraw) { if(item.Material.IsVisible) item.Material.Drawn(gameTime,item, world.CameraManager.ActiveCamera, world.Lights, render); } render.ValidateSamplerStates(); }
public void DrawLights(GameTime gameTime, IWorld world, IDeferredGBuffer deferredGBuffer, RenderHelper render) { render.Clear(Color.Transparent, ClearOptions.Target); foreach (ILight light in world.Lights.Where((a) => a.CastShadown == true && a.Enabled == true)) { switch (light.LightType) { case LightType.Deferred_Directional: DirectionalLightPE dl = light as DirectionalLightPE; shadowMap = shadow.Render(gameTime, render, ginfo, dl, world.CameraManager.ActiveCamera, world, deferredGBuffer); render.PushBlendState(_lightAddBlendState); DrawDirectionalLight(render, ginfo, world.CameraManager.ActiveCamera, dl, deferredGBuffer); render.PopBlendState(); break; case LightType.Deferred_Point: #if WINDOWS System.Diagnostics.Debug.Fail("Point Light Shadow not supported, in production no error will be created, the light just wont cast any shadow"); #endif render.PushBlendState(_lightAddBlendState); DrawPointLight(render, ginfo, world.CameraManager.ActiveCamera, light as PointLightPE, deferredGBuffer, true); render.PopBlendState(); break; case LightType.Deferred_Spot: SpotLightPE sl = light as SpotLightPE; Matrix v = sl.ViewMatrix; Matrix p = sl.ProjMatrix; RenderShadowMap(gameTime, render, ref v, ref p, world, deferredGBuffer); render.PushBlendState(_lightAddBlendState); DrawnSpotLight(render, ginfo, world.CameraManager.ActiveCamera, sl, deferredGBuffer); render.PopBlendState(); break; default: throw new Exception("Light type Unexpected"); } } render.DettachBindedTextures(); render.SetSamplerStates(ginfo.SamplerState); render.PushBlendState(_lightAddBlendState); foreach (ILight light in world.Lights.Where((a) => a.CastShadown != true && a.Enabled == true)) { switch (light.LightType) { case LightType.Deferred_Directional: DirectionalLightPE dl = light as DirectionalLightPE; DrawDirectionalLight(render, ginfo, world.CameraManager.ActiveCamera, dl, deferredGBuffer); break; case LightType.Deferred_Point: DrawPointLight(render, ginfo, world.CameraManager.ActiveCamera, light as PointLightPE, deferredGBuffer, true); break; case LightType.Deferred_Spot: SpotLightPE sl = light as SpotLightPE; DrawnSpotLight(render, ginfo, world.CameraManager.ActiveCamera, sl, deferredGBuffer); break; default: throw new Exception("Light type Unexpected"); } } render.PopBlendState(); }
/// <summary> /// Draws the specified game time. /// </summary> /// <param name="gameTime">The game time.</param> /// <param name="world">The world.</param> /// <param name="render">The render.</param> protected void Draw(GameTime gameTime, IWorld world, RenderHelper render) { Matrix view = world.CameraManager.ActiveCamera.View; Matrix projection = world.CameraManager.ActiveCamera.Projection; world.Culler.StartFrame(ref view, ref projection, world.CameraManager.ActiveCamera.BoundingFrustum); List<IObject> AllnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(null); List<IObject> DeferrednotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.DEFERRED); List<IObject> ForwardnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.FORWARD); if (desc.OrderAllObjectsBeforeDraw != null) AllnotCulledObjectsList = desc.OrderAllObjectsBeforeDraw(AllnotCulledObjectsList); if (desc.OrderDeferredObjectsBeforeDraw != null) DeferrednotCulledObjectsList = desc.OrderDeferredObjectsBeforeDraw(DeferrednotCulledObjectsList); if (desc.OrderForwardObjectsBeforeDraw != null) ForwardnotCulledObjectsList = desc.OrderForwardObjectsBeforeDraw(ForwardnotCulledObjectsList); render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.PreDrawScene(gameTime, world, render, ginfo, AllnotCulledObjectsList); render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.SetGBuffer(render); deferredGBuffer.ClearGBuffer(render); deferredGBuffer.DrawScene(gameTime, world, render, ginfo, DeferrednotCulledObjectsList); deferredGBuffer.ResolveGBuffer(render); render[PrincipalConstants.DephRT] = deferredGBuffer[GBufferTypes.DEPH]; render[PrincipalConstants.normalRt] = deferredGBuffer[GBufferTypes.NORMAL]; render.DettachBindedTextures(); render.ValidateSamplerStates(); deferredLightMap.SetLightMap(render); deferredLightMap.DrawLights(gameTime, world, deferredGBuffer, render); deferredLightMap.ResolveLightMap(render); render[PrincipalConstants.lightRt] = deferredLightMap[DeferredLightMapType.LIGHTMAP]; render.DettachBindedTextures(5); render.ValidateSamplerStates(); render.PushRenderTarget(scenerender); render.Clear(desc.BackGroundColor); foreach (IObject item in AllnotCulledObjectsList) { if (item.Material.IsVisible) item.Material.PosDrawnPhase(gameTime, item, world.CameraManager.ActiveCamera, world.Lights, render); } render.DettachBindedTextures(3); render.ValidateSamplerStates(); if (world.PhysicWorld.isDebugDraw) { world.PhysicWorld.iDebugDrawn(render, gameTime, world.CameraManager.ActiveCamera); } if (world.ParticleManager != null) { world.ParticleManager.iDraw(gameTime, world.CameraManager.ActiveCamera.View, world.CameraManager.ActiveCamera.Projection, render); render.ResyncStates(); render.SetSamplerStates(ginfo.SamplerState); } render.DettachBindedTextures(6); render.ValidateSamplerStates(); render.RenderPosWithDepthComponents(gameTime, ref view, ref projection); render.DettachBindedTextures(6); render.ValidateSamplerStates(); render[PrincipalConstants.colorRT] = scenerender; render[PrincipalConstants.normalRt] = deferredGBuffer[GBufferTypes.NORMAL]; render[PrincipalConstants.lightRt] = deferredLightMap[DeferredLightMapType.LIGHTMAP]; render[PrincipalConstants.DephRT] = deferredGBuffer[GBufferTypes.DEPH]; render[PrincipalConstants.extra1RT] = deferredGBuffer[GBufferTypes.Extra1]; render[PrincipalConstants.CurrentImage] = render[PrincipalConstants.CombinedImage] = render.PopRenderTargetAsSingleRenderTarget2D(); for (int i = 0; i < PostEffects.Count; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, true); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(6); render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); }
/// <summary> /// Draws the specified game time. /// </summary> /// <param name="gameTime">The game time.</param> /// <param name="world">The world.</param> /// <param name="render">The render.</param> protected void Draw(GameTime gameTime, IWorld world, RenderHelper render) { Matrix view = world.CameraManager.ActiveCamera.View; Matrix projection = world.CameraManager.ActiveCamera.Projection; world.Culler.StartFrame(ref view, ref projection, world.CameraManager.ActiveCamera.BoundingFrustum); List <IObject> AllnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(null); List <IObject> DeferrednotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.DEFERRED); List <IObject> ForwardnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.FORWARD); if (desc.OrderAllObjectsBeforeDraw != null) { AllnotCulledObjectsList = desc.OrderAllObjectsBeforeDraw(AllnotCulledObjectsList); } if (desc.OrderDeferredObjectsBeforeDraw != null) { DeferrednotCulledObjectsList = desc.OrderDeferredObjectsBeforeDraw(DeferrednotCulledObjectsList); } if (desc.OrderForwardObjectsBeforeDraw != null) { ForwardnotCulledObjectsList = desc.OrderForwardObjectsBeforeDraw(ForwardnotCulledObjectsList); } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.PreDrawScene(gameTime, world, render, ginfo, AllnotCulledObjectsList); render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.SetGBuffer(render); deferredGBuffer.ClearGBuffer(render); deferredGBuffer.DrawScene(gameTime, world, render, ginfo, DeferrednotCulledObjectsList); deferredGBuffer.ResolveGBuffer(render); render[PrincipalConstants.DephRT] = deferredGBuffer[GBufferTypes.DEPH]; render[PrincipalConstants.normalRt] = deferredGBuffer[GBufferTypes.NORMAL]; render.DettachBindedTextures(); render.ValidateSamplerStates(); deferredLightMap.SetLightMap(render); deferredLightMap.DrawLights(gameTime, world, deferredGBuffer, render); deferredLightMap.ResolveLightMap(render); render[PrincipalConstants.lightRt] = deferredLightMap[DeferredLightMapType.LIGHTMAP]; render.DettachBindedTextures(5); render.ValidateSamplerStates(); render.PushRenderTarget(scenerender); render.Clear(desc.BackGroundColor); foreach (IObject item in AllnotCulledObjectsList) { if (item.Material.IsVisible) { item.Material.PosDrawnPhase(gameTime, item, world.CameraManager.ActiveCamera, world.Lights, render); } } render.DettachBindedTextures(3); render.ValidateSamplerStates(); if (world.PhysicWorld.isDebugDraw) { world.PhysicWorld.iDebugDrawn(render, gameTime, world.CameraManager.ActiveCamera); } if (world.ParticleManager != null) { world.ParticleManager.iDraw(gameTime, world.CameraManager.ActiveCamera.View, world.CameraManager.ActiveCamera.Projection, render); render.ResyncStates(); render.SetSamplerStates(ginfo.SamplerState); } render.DettachBindedTextures(6); render.ValidateSamplerStates(); render.RenderPosWithDepthComponents(gameTime, ref view, ref projection); render.DettachBindedTextures(6); render.ValidateSamplerStates(); render[PrincipalConstants.colorRT] = scenerender; render[PrincipalConstants.normalRt] = deferredGBuffer[GBufferTypes.NORMAL]; render[PrincipalConstants.lightRt] = deferredLightMap[DeferredLightMapType.LIGHTMAP]; render[PrincipalConstants.DephRT] = deferredGBuffer[GBufferTypes.DEPH]; render[PrincipalConstants.extra1RT] = deferredGBuffer[GBufferTypes.Extra1]; render[PrincipalConstants.CurrentImage] = render[PrincipalConstants.CombinedImage] = render.PopRenderTargetAsSingleRenderTarget2D(); for (int i = 0; i < PostEffects.Count; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, true); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(6); render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); }
/// <summary> /// Draws the specified game time. /// </summary> /// <param name="gameTime">The game time.</param> /// <param name="world">The world.</param> /// <param name="render">The render.</param> protected void Draw(GameTime gameTime, IWorld world, RenderHelper render) { Matrix view = world.CameraManager.ActiveCamera.View; Matrix projection = world.CameraManager.ActiveCamera.Projection; world.Culler.StartFrame(ref view, ref projection, world.CameraManager.ActiveCamera.BoundingFrustum); List <IObject> AllnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(null); List <IObject> DeferrednotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.DEFERRED, CullerComparer.ComparerFrontToBack, world.CameraManager.ActiveCamera.Position); List <IObject> ForwardnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.FORWARD, CullerComparer.ComparerBackToFront, world.CameraManager.ActiveCamera.Position); if (desc.OrderAllObjectsBeforeDraw != null) { AllnotCulledObjectsList = desc.OrderAllObjectsBeforeDraw(AllnotCulledObjectsList, world); } if (desc.OrderDeferredObjectsBeforeDraw != null) { DeferrednotCulledObjectsList = desc.OrderDeferredObjectsBeforeDraw(DeferrednotCulledObjectsList, world); } if (desc.OrderForwardObjectsBeforeDraw != null) { ForwardnotCulledObjectsList = desc.OrderForwardObjectsBeforeDraw(ForwardnotCulledObjectsList, world); } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.PreDrawScene(gameTime, world, render, ginfo, AllnotCulledObjectsList); render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.SetGBuffer(render); deferredGBuffer.ClearGBuffer(render); deferredGBuffer.DrawScene(gameTime, world, render, ginfo, DeferrednotCulledObjectsList); deferredGBuffer.ResolveGBuffer(render); render.DettachBindedTextures(); render.ValidateSamplerStates(); deferredLightMap.SetLightMap(render); deferredLightMap.DrawLights(gameTime, world, deferredGBuffer, render); deferredLightMap.ResolveLightMap(render); render.DettachBindedTextures(5); render.ValidateSamplerStates(); deferredFinalCombination.SetFinalCombination(render); deferredFinalCombination.DrawScene(gameTime, world, deferredGBuffer, deferredLightMap, render); render.DettachBindedTextures(3); render.ValidateSamplerStates(); if (desc.ExtraForwardPass) { render[PrincipalConstants.colorRT] = deferredGBuffer[GBufferTypes.COLOR]; render[PrincipalConstants.normalRt] = deferredGBuffer[GBufferTypes.NORMAL]; render[PrincipalConstants.lightRt] = deferredLightMap[DeferredLightMapType.LIGHTMAP]; render[PrincipalConstants.DephRT] = deferredGBuffer[GBufferTypes.DEPH]; render[PrincipalConstants.extra1RT] = deferredGBuffer[GBufferTypes.Extra1]; render[PrincipalConstants.CombinedImage] = deferredFinalCombination[GBufferTypes.FINALIMAGE]; render[PrincipalConstants.CurrentImage] = deferredFinalCombination[GBufferTypes.FINALIMAGE]; if (desc.RestoreDepthOption == RestoreDepthOption.BEFORE_POSTEFFECT) { restoreDepth.PerformForwardPass(render[PrincipalConstants.CombinedImage], render[PrincipalConstants.DephRT], render, ginfo); render.DettachBindedTextures(2); render.ValidateSamplerStates(); if (world.PhysicWorld.isDebugDraw) { world.PhysicWorld.iDebugDrawn(render, gameTime, world.CameraManager.ActiveCamera); } if (world.ParticleManager != null) { world.ParticleManager.iDraw(gameTime, world.CameraManager.ActiveCamera.View, world.CameraManager.ActiveCamera.Projection, render); render.ResyncStates(); render.SetSamplerStates(ginfo.SamplerState); } render.DettachBindedTextures(6); render.ValidateSamplerStates(); forwardPass.Draw(gameTime, world, render, DeferrednotCulledObjectsList, ForwardnotCulledObjectsList); render.DettachBindedTextures(6); render.ValidateSamplerStates(); render.RenderPosWithDepthComponents(gameTime, ref view, ref projection); render.DettachBindedTextures(6); render.ValidateSamplerStates(); render[PrincipalConstants.CurrentImage] = restoreDepth.EndForwardPass(render); render[PrincipalConstants.CombinedImage] = render[PrincipalConstants.CurrentImage]; for (int i = 0; i < PostEffects.Count; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, desc.UseFloatingBufferForLightMap); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(6); if (desc.UseFloatingBufferForLightMap) { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); } else { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, ginfo.SamplerState); } } else if (desc.RestoreDepthOption == RestoreDepthOption.AFTER_POSTEFFECT) { for (int i = 0; i < PostEffects.Count; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, desc.UseFloatingBufferForLightMap); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(16); restoreDepth.PerformForwardPass(render[PrincipalConstants.CurrentImage], render[PrincipalConstants.DephRT], render, ginfo); render.DettachBindedTextures(2); if (world.PhysicWorld.isDebugDraw) { world.PhysicWorld.iDebugDrawn(render, gameTime, world.CameraManager.ActiveCamera); } if (world.ParticleManager != null) { world.ParticleManager.iDraw(gameTime, world.CameraManager.ActiveCamera.View, world.CameraManager.ActiveCamera.Projection, render); render.ResyncStates(); render.SetSamplerStates(ginfo.SamplerState); } render.DettachBindedTextures(16); forwardPass.Draw(gameTime, world, render, DeferrednotCulledObjectsList, ForwardnotCulledObjectsList); render.DettachBindedTextures(16); render.RenderPosWithDepthComponents(gameTime, ref view, ref projection); render.DettachBindedTextures(16); render[PrincipalConstants.CurrentImage] = restoreDepth.EndForwardPass(render); if (desc.UseFloatingBufferForLightMap) { System.Diagnostics.Debug.Assert(render.PeekBlendState() == BlendState.Opaque); render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); System.Diagnostics.Debug.Assert(render.PeekBlendState() == BlendState.Opaque); } else { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, ginfo.SamplerState); } } else if (desc.RestoreDepthOption == RestoreDepthOption.NONE) { for (int i = 0; i < PostEffects.Count; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, desc.UseFloatingBufferForLightMap); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; System.Diagnostics.Debug.Assert(tex != null); render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } if (desc.UseFloatingBufferForLightMap) { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); } else { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, ginfo.SamplerState); } } render.RenderPosComponents(gameTime, ref view, ref projection); if (desc.DefferedDebug) { render.Clear(Color.Black); if (desc.UseFloatingBufferForLightMap) { render.RenderBegin(Matrix.Identity, null, SpriteSortMode.Immediate, SamplerState.PointClamp); } else { render.RenderBegin(Matrix.Identity, null, SpriteSortMode.Immediate, ginfo.SamplerState); } render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[0]], Color.White, new Rectangle(0, 0, halfWidth, halfHeight)); render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[1]], Color.White, new Rectangle(0, halfHeight, halfWidth, halfHeight)); render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[2]], Color.White, new Rectangle(halfWidth, 0, halfWidth, halfHeight)); render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[3]], Color.White, new Rectangle(halfWidth, halfHeight, halfWidth, halfHeight)); render.RenderEnd(); } } else { render.RenderPosComponents(gameTime, ref view, ref projection); } render.ValidateSamplerStates(); }
/// <summary> /// Draws the specified game time. /// </summary> /// <param name="gameTime">The game time.</param> /// <param name="world">The world.</param> /// <param name="render">The render.</param> protected void Draw(GameTime gameTime, IWorld world, RenderHelper render) { Matrix view = world.CameraManager.ActiveCamera.View; Matrix projection = world.CameraManager.ActiveCamera.Projection; world.Culler.StartFrame(ref view, ref projection, world.CameraManager.ActiveCamera.BoundingFrustum); List<IObject> AllnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(null); List<IObject> DeferrednotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.DEFERRED, CullerComparer.ComparerFrontToBack,world.CameraManager.ActiveCamera.Position); List<IObject> ForwardnotCulledObjectsList = world.Culler.GetNotCulledObjectsList(MaterialType.FORWARD, CullerComparer.ComparerBackToFront, world.CameraManager.ActiveCamera.Position); if (desc.OrderAllObjectsBeforeDraw != null) AllnotCulledObjectsList = desc.OrderAllObjectsBeforeDraw(AllnotCulledObjectsList,world); if (desc.OrderDeferredObjectsBeforeDraw != null) DeferrednotCulledObjectsList = desc.OrderDeferredObjectsBeforeDraw(DeferrednotCulledObjectsList, world); if (desc.OrderForwardObjectsBeforeDraw != null) ForwardnotCulledObjectsList = desc.OrderForwardObjectsBeforeDraw(ForwardnotCulledObjectsList, world); render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.PreDrawScene(gameTime, world, render, ginfo, AllnotCulledObjectsList); render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(); deferredGBuffer.SetGBuffer(render); deferredGBuffer.ClearGBuffer(render); deferredGBuffer.DrawScene(gameTime, world, render, ginfo, DeferrednotCulledObjectsList); deferredGBuffer.ResolveGBuffer(render); render.DettachBindedTextures(); render.ValidateSamplerStates(); deferredLightMap.SetLightMap(render); deferredLightMap.DrawLights(gameTime, world, deferredGBuffer, render); deferredLightMap.ResolveLightMap(render); render.DettachBindedTextures(5); render.ValidateSamplerStates(); deferredFinalCombination.SetFinalCombination(render); deferredFinalCombination.DrawScene(gameTime, world, deferredGBuffer, deferredLightMap,render); render.DettachBindedTextures(3); render.ValidateSamplerStates(); if (desc.ExtraForwardPass) { render[PrincipalConstants.colorRT] = deferredGBuffer[GBufferTypes.COLOR]; render[PrincipalConstants.normalRt] = deferredGBuffer[GBufferTypes.NORMAL]; render[PrincipalConstants.lightRt] = deferredLightMap[DeferredLightMapType.LIGHTMAP]; render[PrincipalConstants.DephRT] = deferredGBuffer[GBufferTypes.DEPH]; render[PrincipalConstants.extra1RT] = deferredGBuffer[GBufferTypes.Extra1]; render[PrincipalConstants.CombinedImage] = deferredFinalCombination[GBufferTypes.FINALIMAGE]; render[PrincipalConstants.CurrentImage] = deferredFinalCombination[GBufferTypes.FINALIMAGE]; if (desc.RestoreDepthOption == RestoreDepthOption.BEFORE_POSTEFFECT) { restoreDepth.PerformForwardPass(render[PrincipalConstants.CombinedImage], render[PrincipalConstants.DephRT], render,ginfo); render.DettachBindedTextures(2); render.ValidateSamplerStates(); if (world.PhysicWorld.isDebugDraw) { world.PhysicWorld.iDebugDrawn(render, gameTime, world.CameraManager.ActiveCamera); } if (world.ParticleManager != null) { world.ParticleManager.iDraw(gameTime, world.CameraManager.ActiveCamera.View, world.CameraManager.ActiveCamera.Projection, render); render.ResyncStates(); render.SetSamplerStates(ginfo.SamplerState); } render.DettachBindedTextures(6); render.ValidateSamplerStates(); forwardPass.Draw(gameTime, world, render,DeferrednotCulledObjectsList,ForwardnotCulledObjectsList); render.DettachBindedTextures(6); render.ValidateSamplerStates(); render.RenderPosWithDepthComponents(gameTime, ref view, ref projection); render.DettachBindedTextures(6); render.ValidateSamplerStates(); render[PrincipalConstants.CurrentImage] = restoreDepth.EndForwardPass(render); render[PrincipalConstants.CombinedImage] = render[PrincipalConstants.CurrentImage]; for (int i = 0; i < PostEffects.Count; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, desc.UseFloatingBufferForLightMap); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(6); if (desc.UseFloatingBufferForLightMap) { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); } else { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity,null,true,SpriteSortMode.Deferred,ginfo.SamplerState); } } else if (desc.RestoreDepthOption == RestoreDepthOption.AFTER_POSTEFFECT) { for (int i = 0; i < PostEffects.Count; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, desc.UseFloatingBufferForLightMap); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } render.SetSamplerStates(ginfo.SamplerState); render.DettachBindedTextures(16); restoreDepth.PerformForwardPass(render[PrincipalConstants.CurrentImage], render[PrincipalConstants.DephRT], render, ginfo); render.DettachBindedTextures(2); if (world.PhysicWorld.isDebugDraw) { world.PhysicWorld.iDebugDrawn(render, gameTime, world.CameraManager.ActiveCamera); } if (world.ParticleManager != null) { world.ParticleManager.iDraw(gameTime, world.CameraManager.ActiveCamera.View, world.CameraManager.ActiveCamera.Projection, render); render.ResyncStates(); render.SetSamplerStates(ginfo.SamplerState); } render.DettachBindedTextures(16); forwardPass.Draw(gameTime, world, render,DeferrednotCulledObjectsList,ForwardnotCulledObjectsList); render.DettachBindedTextures(16); render.RenderPosWithDepthComponents(gameTime, ref view, ref projection); render.DettachBindedTextures(16); render[PrincipalConstants.CurrentImage] = restoreDepth.EndForwardPass(render); if (desc.UseFloatingBufferForLightMap) { System.Diagnostics.Debug.Assert(render.PeekBlendState() == BlendState.Opaque); render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); System.Diagnostics.Debug.Assert(render.PeekBlendState() == BlendState.Opaque); } else { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, ginfo.SamplerState); } } else if (desc.RestoreDepthOption == RestoreDepthOption.NONE) { for (int i = 0; i < PostEffects.Count ; i++) { if (PostEffects[i].Enabled) { render.PushRenderTarget(PostEffectTarget); render.Clear(Color.Black); PostEffects[i].Draw(render[PrincipalConstants.CurrentImage], render, gameTime, ginfo, world, desc.UseFloatingBufferForLightMap); Texture2D tex = render.PopRenderTarget()[0].RenderTarget as Texture2D; System.Diagnostics.Debug.Assert(tex != null); render[PrincipalConstants.CurrentImage] = tex; SwapTargetBuffers(); } } if (desc.UseFloatingBufferForLightMap) { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, SamplerState.PointClamp); } else { render.Clear(Color.Black); render.RenderTextureComplete(render[PrincipalConstants.CurrentImage], Color.White, ginfo.FullScreenRectangle, Matrix.Identity, null, true, SpriteSortMode.Deferred, ginfo.SamplerState); } } render.RenderPosComponents(gameTime, ref view, ref projection); if (desc.DefferedDebug) { render.Clear(Color.Black); if (desc.UseFloatingBufferForLightMap) render.RenderBegin(Matrix.Identity,null,SpriteSortMode.Immediate,SamplerState.PointClamp); else render.RenderBegin(Matrix.Identity, null, SpriteSortMode.Immediate, ginfo.SamplerState); render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[0]] ,Color.White, new Rectangle(0, 0, halfWidth, halfHeight)); render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[1]], Color.White, new Rectangle(0, halfHeight, halfWidth, halfHeight)); render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[2]], Color.White, new Rectangle(halfWidth, 0, halfWidth, halfHeight)); render.RenderTexture(render[desc.RenderTargetsNameToDefferedDebug[3]], Color.White, new Rectangle(halfWidth, halfHeight, halfWidth, halfHeight)); render.RenderEnd(); } } else { render.RenderPosComponents(gameTime, ref view, ref projection); } render.ValidateSamplerStates(); }