Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
RenderPipelineLightingFactory.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using SiliconStudio.Core;
5 using SiliconStudio.Core.Mathematics;
6 using SiliconStudio.Paradox.Effects.Modules.Processors;
7 using SiliconStudio.Paradox.Effects.Modules.Renderers;
8 using SiliconStudio.Paradox.EntityModel;
9 using SiliconStudio.Paradox.Graphics;
10 
11 namespace SiliconStudio.Paradox.Effects.Modules
12 {
13  public static class RenderPipelineLightingFactory
14  {
15  #region Public methods
16 
17  /// <summary>
18  /// Creates a basic forward rendering pipeline.
19  /// </summary>
20  /// <param name="serviceRegistry">The IServiceRegistry.</param>
21  /// <param name="effectName">The name of the main effect.</param>
22  /// <param name="clearColor">The clear color of the final frame buffer.</param>
23  /// <param name="useShadows">A flag stating if shadows are available in this pipeline.</param>
24  /// <param name="ui">A flag stating if a UI renderer should be added to the pipeline.</param>
25  /// <param name="backgroundName">The name of the background texture.</param>
26  public static void CreateDefaultForward(IServiceRegistry serviceRegistry, string effectName, Color clearColor, bool useShadows, bool ui, string backgroundName)
27  {
28  if (serviceRegistry == null) throw new ArgumentNullException("serviceRegistry");
29  if (effectName == null) throw new ArgumentNullException("effectName");
30 
31  var renderSystem = serviceRegistry.GetSafeServiceAs<RenderSystem>();
32  var graphicsService = serviceRegistry.GetSafeServiceAs<IGraphicsDeviceService>();
33 
34  // Adds a light processor that will track all the entities that have a light component.
35  // This will also handle the shadows (allocation, activation etc.).
36  AddLightProcessor(serviceRegistry, graphicsService.GraphicsDevice, useShadows);
37 
38  var mainPipeline = renderSystem.Pipeline;
39 
40  // Adds a camera setter that will automatically fill the parameters from the camera (matrices, fov etc.).
41  mainPipeline.Renderers.Add(new CameraSetter(serviceRegistry));
42 
43  // Adds a recursive pass to render the shadow maps
44  // This will render all the meshes with a different effect for shadow casting.
45  if (useShadows)
46  AddShadowMap(serviceRegistry, mainPipeline, effectName);
47 
48  // Sets the render targets and clear them.
49  mainPipeline.Renderers.Add(new RenderTargetSetter(serviceRegistry)
50  {
51  ClearColor = clearColor,
52  RenderTarget = graphicsService.GraphicsDevice.BackBuffer,
53  DepthStencil = graphicsService.GraphicsDevice.DepthStencilBuffer
54  });
55 
56  // Draws a background from a texture.
57  if (backgroundName != null)
58  mainPipeline.Renderers.Add(new BackgroundRenderer(serviceRegistry, backgroundName));
59 
60  // Renders all the meshes with the correct lighting.
61  mainPipeline.Renderers.Add(new ModelRenderer(serviceRegistry, effectName).AddLightForwardSupport());
62 
63  // Renders the UI.
64  if (ui)
65  mainPipeline.Renderers.Add(new UIRenderer(serviceRegistry));
66  }
67 
68  /// <summary>
69  /// Creates a basic forward rendering pipeline.
70  /// </summary>
71  /// <param name="game">The game.</param>
72  /// <param name="effectName">The name of the main effect.</param>
73  /// <param name="clearColor">The clear color of the final frame buffer.</param>
74  /// <param name="useShadows">A flag stating if shadows are available in this pipeline.</param>
75  /// <param name="ui">A flag stating if a UI renderer should be added to the pipeline.</param>
76  /// <param name="backgroundName">The name of the background texture.</param>
77  public static void CreateDefaultForward(Game game, string effectName, Color clearColor, bool useShadows, bool ui, string backgroundName = null)
78  {
79  CreateDefaultForward(game.Services, effectName, clearColor, useShadows, ui, backgroundName);
80  }
81 
82  /// <summary>
83  /// Destroys the forward rendering pipeline.
84  /// </summary>
85  /// <param name="game">The game.</param>
86  public static void DestroyDefaultForwardPipeline(Game game)
87  {
88  if (game == null) throw new ArgumentNullException("game");
89 
90  var serviceRegistry = game.Services;
91  if (serviceRegistry == null)
92  return;
93 
94  var renderSystem = serviceRegistry.GetSafeServiceAs<RenderSystem>();
95  var entitySystem = serviceRegistry.GetServiceAs<EntitySystem>();
96 
97  var mainPipeline = renderSystem.Pipeline;
98 
99  /** TODO rewrite this
100  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<UIRenderer>());
101  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<LightForwardModelRenderer>());
102  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<BackgroundRenderer>());
103  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<RenderTargetSetter>());
104  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<ShadowMapRenderer>());
105  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<CameraSetter>());
106  entitySystem.Processors.Remove(entitySystem.GetProcessor<LightShadowProcessor>());
107  */
108  }
109 
110  /// <summary>
111  /// Creates a basic deferred rendering pipeline.
112  /// </summary>
113  /// <param name="serviceRegistry">The IServiceRegistry.</param>
114  /// <param name="effectName">The name of the main effect.</param>
115  /// <param name="prepassEffectName">The name of the light prepass effect.</param>
116  /// <param name="clearColor">The clear color of the final frame buffer.</param>
117  /// <param name="useShadows">A flag stating if shadows are available in this pipeline.</param>
118  /// <param name="ui">A flag stating if a UI renderer should be added to the pipeline.</param>
119  /// <param name="backgroundName">The name of the background texture.</param>
120  public static void CreateDefaultDeferred(IServiceRegistry serviceRegistry, string effectName, string prepassEffectName, Color clearColor, bool useShadows, bool ui, string backgroundName)
121  {
122  if (serviceRegistry == null) throw new ArgumentNullException("serviceRegistry");
123  if (effectName == null) throw new ArgumentNullException("effectName");
124 
125  var renderSystem = serviceRegistry.GetSafeServiceAs<RenderSystem>();
126  var graphicsService = serviceRegistry.GetSafeServiceAs<IGraphicsDeviceService>();
127 
128  // Adds a light processor that will track all the entities that have a light component.
129  // This will also handle the shadows (allocation, activation etc.).
130  AddLightProcessor(serviceRegistry, graphicsService.GraphicsDevice, useShadows);
131 
132  // Create Main pass
133  var mainPipeline = renderSystem.Pipeline;
134 
135  // Adds a camera setter that will automatically fill the parameters from the camera (matrices, fov etc.).
136  mainPipeline.Renderers.Add(new CameraSetter(serviceRegistry));
137 
138  // Adds a recursive pass to render the shadow maps
139  // This will render all the meshes with a different effect for shadow casting.
140  if (useShadows)
141  AddShadowMap(serviceRegistry, mainPipeline, effectName);
142 
143  // Create G-buffer pass
144  var gbufferPipeline = new RenderPipeline("GBuffer");
145 
146  // Renders the G-buffer for opaque geometry.
147  gbufferPipeline.Renderers.Add(new ModelRenderer(serviceRegistry, effectName + ".ParadoxGBufferShaderPass").AddOpaqueFilter());
148  var gbufferProcessor = new GBufferRenderProcessor(serviceRegistry, gbufferPipeline, graphicsService.GraphicsDevice.DepthStencilBuffer, false);
149 
150  // Add sthe G-buffer pass to the pipeline.
151  mainPipeline.Renderers.Add(gbufferProcessor);
152 
153  // Performs the light prepass on opaque geometry.
154  // Adds this pass to the pipeline.
155  var lightDeferredProcessor = new LightingPrepassRenderer(serviceRegistry, prepassEffectName, graphicsService.GraphicsDevice.DepthStencilBuffer.Texture, gbufferProcessor.GBufferTexture);
156  mainPipeline.Renderers.Add(lightDeferredProcessor);
157 
158  // Sets the render targets and clear them. Also sets the viewport.
159  mainPipeline.Renderers.Add(new RenderTargetSetter(serviceRegistry)
160  {
161  ClearColor = clearColor,
162  EnableClearDepth = false,
163  RenderTarget = graphicsService.GraphicsDevice.BackBuffer,
164  DepthStencil = graphicsService.GraphicsDevice.DepthStencilBuffer,
165  Viewport = new Viewport(0, 0, graphicsService.GraphicsDevice.BackBuffer.Width, graphicsService.GraphicsDevice.BackBuffer.Height)
166  });
167 
168  // Draws a background from a texture.
169  if (backgroundName != null)
170  mainPipeline.Renderers.Add(new BackgroundRenderer(serviceRegistry, backgroundName));
171 
172  // Prevents depth write since depth was already computed in G-buffer pas.
173  mainPipeline.Renderers.Add(new RenderStateSetter(serviceRegistry) { DepthStencilState = graphicsService.GraphicsDevice.DepthStencilStates.DepthRead });
174  mainPipeline.Renderers.Add(new ModelRenderer(serviceRegistry, effectName).AddOpaqueFilter());
175  mainPipeline.Renderers.Add(new RenderTargetSetter(serviceRegistry)
176  {
177  EnableClearDepth = false,
178  EnableClearTarget = false,
179  RenderTarget = graphicsService.GraphicsDevice.BackBuffer,
180  DepthStencil = graphicsService.GraphicsDevice.DepthStencilBuffer,
181  Viewport = new Viewport(0, 0, graphicsService.GraphicsDevice.BackBuffer.Width, graphicsService.GraphicsDevice.BackBuffer.Height)
182  });
183 
184  // Renders transparent geometry. Depth stencil state is determined by the object to draw.
185  //mainPipeline.Renderers.Add(new RenderStateSetter(serviceRegistry) { DepthStencilState = graphicsService.GraphicsDevice.DepthStencilStates.DepthRead });
186  mainPipeline.Renderers.Add(new ModelRenderer(serviceRegistry, effectName).AddTransparentFilter());
187 
188  // Renders the UI.
189  if (ui)
190  mainPipeline.Renderers.Add(new UIRenderer(serviceRegistry));
191 
192  graphicsService.GraphicsDevice.Parameters.Set(RenderingParameters.UseDeferred, true);
193  }
194 
195  /// <summary>
196  /// Creates a basic deferred rendering pipeline.
197  /// </summary>
198  /// <param name="game">The game.</param>
199  /// <param name="effectName">The name of the main effect.</param>
200  /// <param name="prepassEffectName">The name of the light prepass effect.</param>
201  /// <param name="clearColor">The clear color.</param>
202  /// <param name="useShadows">A flag stating if shadows are available in this pipeline.</param>
203  /// <param name="backgroundName">The name of the background texture.</param>
204  public static void CreateDefaultDeferred(Game game, string effectName, string prepassEffectName, Color clearColor, bool useShadows, bool ui, string backgroundName = null)
205  {
206  CreateDefaultDeferred(game.Services, effectName, prepassEffectName, clearColor, useShadows, ui, backgroundName);
207  }
208 
209  /// <summary>
210  /// Destroys the deferred rendering pipeline.
211  /// </summary>
212  /// <param name="game">The game.</param>
213  public static void DestroyDefaultDeferredPipeline(Game game)
214  {
215  if (game == null) throw new ArgumentNullException("game");
216 
217  var serviceRegistry = game.Services;
218  if (serviceRegistry == null)
219  return;
220 
221  var renderSystem = serviceRegistry.GetSafeServiceAs<RenderSystem>();
222  var entitySystem = serviceRegistry.GetServiceAs<EntitySystem>();
223 
224  var mainPipeline = renderSystem.Pipeline;
225 
226  /*TODO REVIEW THIS CLASS
227  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<UIRenderer>());
228  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<TransparentModelRenderer>());
229  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<RenderStateSetter>());
230  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<RenderTargetSetter>());
231  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<OpaqueModelRenderer>());
232  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<RenderStateSetter>());
233  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<BackgroundRenderer>());
234  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<RenderTargetSetter>());
235  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<LightingPrepassRenderer>());
236  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<GBufferRenderProcessor>());
237  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<ShadowMapRenderer>());
238  mainPipeline.Renderers.Remove(mainPipeline.GetProcessor<CameraSetter>());
239  */
240  entitySystem.Processors.Remove(entitySystem.GetProcessor<LightShadowProcessor>());
241  }
242 
243  #endregion
244 
245  #region Private methods
246 
247  private static ShadowMapRenderer AddShadowMap(IServiceRegistry serviceRegistry, RenderPipeline pipeline, string effectName)
248  {
249  var shadowMapPipeline = new RenderPipeline("ShadowMap");
250  shadowMapPipeline.Renderers.Add(new ModelRenderer(serviceRegistry, effectName + ".ShadowMapCaster").AddContextActiveLayerFilter().AddShadowCasterFilter());
251 
252  var shadowMapRenderer = new ShadowMapRenderer(serviceRegistry, shadowMapPipeline);
253  pipeline.Renderers.Add(shadowMapRenderer);
254 
255  return shadowMapRenderer;
256  }
257 
258  private static void AddLightProcessor(IServiceRegistry serviceRegistry, GraphicsDevice graphicsDevice, bool useShadows)
259  {
260  var entitySystem = serviceRegistry.GetServiceAs<EntitySystem>();
261  if (entitySystem != null)
262  {
263  var lightProcessor = entitySystem.GetProcessor<LightShadowProcessor>();
264  if (lightProcessor == null)
265  entitySystem.Processors.Add(new DynamicLightShadowProcessor(graphicsDevice, useShadows));
266  }
267  }
268 
269  #endregion
270  }
271 }
Service providing method to access GraphicsDevice life-cycle.
The renderer in charge of drawing the UI.
Definition: UIRenderer.cs:17
static void CreateDefaultDeferred(Game game, string effectName, string prepassEffectName, Color clearColor, bool useShadows, bool ui, string backgroundName=null)
Creates a basic deferred rendering pipeline.
Contains depth-stencil state for the device.
This renderer draws a full-screen image as background. The ratio or the texture used is preserved...
A service registry is a IServiceProvider that provides methods to register and unregister services...
A processor that updates camera view and projection along the setup of RenderTargetSetter ...
Definition: CameraSetter.cs:16
Main Game class system.
Definition: Game.cs:32
ServiceRegistry Services
Gets the service container.
Definition: GameBase.cs:308
Performs primitive-based rendering, creates resources, handles system-level variables, adjusts gamma ramp levels, and creates shaders. See The+GraphicsDevice+class to learn more about the class.
static void CreateDefaultForward(Game game, string effectName, Color clearColor, bool useShadows, bool ui, string backgroundName=null)
Creates a basic forward rendering pipeline.
Renders its RenderSystem.Pipeline, which will usually result in drawing all meshes, UI, etc...
Definition: RenderSystem.cs:18
Manage a collection of entities.
Definition: EntitySystem.cs:22
Defines the window dimensions of a render-target surface onto which a 3D volume projects.
Definition: Viewport.cs:14
Represents a 32-bit color (4 bytes) in the form of RGBA (in byte order: R, G, B, A).
Definition: Color.cs:16
static void DestroyDefaultDeferredPipeline(Game game)
Destroys the deferred rendering pipeline.
This Renderer is responsible to prepare and render meshes for a specific pass.
static void CreateDefaultForward(IServiceRegistry serviceRegistry, string effectName, Color clearColor, bool useShadows, bool ui, string backgroundName)
Creates a basic forward rendering pipeline.
static void CreateDefaultDeferred(IServiceRegistry serviceRegistry, string effectName, string prepassEffectName, Color clearColor, bool useShadows, bool ui, string backgroundName)
Creates a basic deferred rendering pipeline.
A processor that setup a RenderTarget and a DepthStencil on a RenderPass.
A class allocating as many shadow map as possible without any predefined memory budget.
Defines an entry point for mesh instantiation and recursive rendering.
static void DestroyDefaultForwardPipeline(Game game)
Destroys the forward rendering pipeline.
Sets given render state during rendering.