Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
AOPlugin.cs
Go to the documentation of this file.
1 // Copyright (c) 2011 Silicon Studio
2 
3 using System;
4 using SiliconStudio.Paradox.Effects.Modules;
5 using SiliconStudio.Paradox.Games;
6 using SiliconStudio.Paradox.Graphics;
7 using SiliconStudio.Core;
8 using SiliconStudio.Core.Mathematics;
9 using SiliconStudio.Paradox.Shaders;
10 
11 namespace SiliconStudio.Paradox.Effects
12 {
13  public enum AOQuality
14  {
15  Low,
16  Medium,
17  High
18  }
19 
20  /// <summary>
21  /// Posteffect manager.
22  /// </summary>
23  public class AOPlugin : RenderPassPlugin
24  {
25  public AOPlugin() : this(null)
26  {
27  }
28 
29  public AOPlugin(string name) : base(name)
30  {
31  Quality = AOQuality.Medium;
32  UseNormal = true;
33  BlurRadius = 7.0f;
34  BlurSharpness = 1.0f;
35  Radius = 35;
36  Contrast = 1.25f;
37  AngleBias = 30.0f;
38  Attenuation = 1.0f;
39  CountDirection = 16;
40  CountStepMax = 8;
41  }
42 
43  public GBufferPlugin GBufferPlugin { get; set; }
44 
45  public RenderTarget RenderTarget { get; set; }
46 
47  public bool UseNormal { get; set; }
48 
49  public AOQuality Quality { get; set; }
50 
51  public float BlurRadius { get; set; }
52 
53  public float BlurSharpness { get; set; }
54 
55  public float Radius { get; set; }
56 
57  public float Contrast { get; set; }
58 
59  public float AngleBias { get; set; }
60 
61  public float Attenuation { get; set; }
62 
63  public int CountDirection { get; set; }
64 
65  public int CountStepMax { get; set; }
66 
67  public override void Initialize()
68  {
69  base.Initialize();
70  }
71 
72  public override void Load()
73  {
74  base.Load();
75 
76  var postEffectsPlugin = new PostEffectGraphPlugin("PostEffectPlugin") { RenderPass = RenderPass };
77  EffectOld hbaoEffect = this.EffectSystemOld.BuildEffect("HBAO")
78  .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectsPlugin })
79  .Using(new BasicShaderPlugin(new ShaderClassSource("PostEffectHBAO") { GenericArguments = new object[] { UseNormal ? 1 : 0, (int)Quality } }))
80  .KeepAliveBy(ActiveObjects)
81  .InstantiatePermutation()
82  .KeepAliveBy(ActiveObjects);
83 
84  // Parameters.AddSources(MainPlugin.ViewParameters);
85 
86  if (OfflineCompilation)
87  return;
88 
90 
91  bool doBlur = true;
92  bool halfResAO = false;
93 
94  //=================================================
95  //Add hbao pass
96  //==========================================
97  //HBAO params
98  int HBAO_numDir = 16; //TODO: should we recreate the random texture if we change this parameter?
99 
100  //==========================================
101  //Create random texture
102  var rng = new Random(0);
103  Vector3[] tab = new Vector3[64 * 64];
104  for (int i = 0; i < 64 * 64; i++)
105  {
106  float angle = (float)(2.0 * Math.PI * rng.NextDouble()) / (float)HBAO_numDir;
107  Vector3 sample = new Vector3(
108  (float)Math.Cos(angle),
109  (float)Math.Sin(angle),
110  (float)rng.NextDouble()
111  );
112  tab[i] = sample;
113  }
114 
115  var randomTexture = Texture2D.New(GraphicsDevice, 64, 64, PixelFormat.R32G32B32_Float, tab);
116 
117  var hbaoQuadMesh = new EffectMesh(hbaoEffect, name: "HBAO level").KeepAliveBy(ActiveObjects);
118 
119  //var renderTarget = renderingSetup.MainPlugin.RenderTarget;
120  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.RandomTexture, randomTexture);
121  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.CountDirection, CountDirection);
122  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.CountStepMax, CountStepMax);
123  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Radius, Radius);
124  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Attenuation, Attenuation);
125  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.AngleBias, AngleBias * (float)Math.PI / 180.0f);
126  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.Contrast, Contrast);
127  hbaoQuadMesh.Parameters.Set(PostEffectHBAOKeys.RenderTargetResolutionRatio, halfResAO ? 0.5f : 1.0f);
128  hbaoQuadMesh.Parameters.Set(GBufferBaseKeys.GBufferTexture, GBufferPlugin.GBufferTexture);
129  hbaoQuadMesh.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture);
130 
131  if (!doBlur)
132  {
133  var aoRenderTarget = Texture2D.New(GraphicsDevice, GraphicsDevice.BackBuffer.Width, GraphicsDevice.BackBuffer.Height, PixelFormat.R8_UNorm, TextureFlags.RenderTarget).ToRenderTarget().KeepAliveBy(ActiveObjects);
134  aoRenderTarget.Name = "AOTexture";
135  hbaoQuadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, aoRenderTarget);
136  }
137  else
138  {
139  EffectOld hbaoBlurEffect = this.EffectSystemOld.BuildEffect("HBAO Blur")
140  .Using(new PostEffectShaderPlugin() { RenderPassPlugin = postEffectsPlugin })
141  .Using(new BasicShaderPlugin("PostEffectHBAOBlur"))
142  .InstantiatePermutation();
143 
144  //=====================================================================
145  //BlurX
146  EffectMesh hbaoBlurQuadMeshX = new EffectMesh(hbaoBlurEffect, name: "HBAO Blur X level");
147  hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurDirection, new Vector2(1, 0));
148  hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurRadius, BlurRadius);
149  hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.BlurSharpness, BlurSharpness);
150  hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.ColorTexture, colorTexture);
151  hbaoBlurQuadMeshX.Parameters.Set(PostEffectHBAOBlurKeys.MultiplyResultWithColorTarget, false);
152  hbaoBlurQuadMeshX.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture);
153 
154  //TODO: check the format (RGB 8 bits, or Float or half-float?)
155  //TODO: check the resolution (can be half!), must update PostEffectSSDOKeys uniforms!
156  var backBuffer = GraphicsDevice.BackBuffer;
157  postEffectsPlugin.AddLink(
158  hbaoQuadMesh,
159  RenderTargetKeys.RenderTarget,
160  hbaoBlurQuadMeshX,
161  PostEffectHBAOBlurKeys.AmbiantOcclusionTexture,
162  new TextureDescription() { Width = backBuffer.Width >> (halfResAO ? 1 : 0), Height = backBuffer.Height >> (halfResAO ? 1 : 0), Format = PixelFormat.R8_UNorm });
163  //hbaoBlurQuadMeshX.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget);
164 
165  //=====================================================================
166  //BlurY
167  EffectMesh hbaoBlurQuadMeshY = new EffectMesh(hbaoBlurEffect, name: "HBAO Blur Y level");
168  hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurDirection, new Vector2(0, 1));
169  hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurRadius, BlurRadius);
170  hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.BlurSharpness, BlurSharpness);
171  hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.ColorTexture, colorTexture);
172  hbaoBlurQuadMeshY.Parameters.Set(PostEffectHBAOBlurKeys.MultiplyResultWithColorTarget, !Debug);
173  hbaoBlurQuadMeshY.Parameters.Set(RenderTargetKeys.DepthStencilSource, GBufferPlugin.DepthStencil.Texture);
174 
175  //TODO: check the format (RGB 8 bits, or Float or half-float?)
176  //TODO: check the resolution (can be half!), must update PostEffectSSDOKeys uniforms!
177  postEffectsPlugin.AddLink(
178  hbaoBlurQuadMeshX,
179  RenderTargetKeys.RenderTarget,
180  hbaoBlurQuadMeshY,
181  PostEffectHBAOBlurKeys.AmbiantOcclusionTexture,
182  new TextureDescription { Width = backBuffer.Width, Height = backBuffer.Height, Format = PixelFormat.R8_UNorm });
183 
184  hbaoBlurQuadMeshY.Parameters.Set(RenderTargetKeys.RenderTarget, RenderTarget);
185  }
186 
187  var effectMeshGroup = new RenderPassListEnumerator();
188  foreach (var mesh in postEffectsPlugin.Meshes)
189  RenderSystem.GlobalMeshes.AddMesh(mesh);
190 
191  // Link post effects (this will create intermediate surfaces)
192  postEffectsPlugin.Resolve();
193  }
194 
195  public override void Unload()
196  {
197  base.Unload();
198 
199  throw new NotImplementedException();
200  }
201  }
202 }
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
virtual RenderTarget RenderTarget
Gets or sets the render target.
Plugin used to render to a GBuffer from a MainPlugin.
Represents a three dimensional mathematical vector.
Definition: Vector3.cs:42
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.
A Common description for all textures.
A Texture 2D frontend to SharpDX.Direct3D11.Texture2D.
Definition: Texture2D.cs:37
Posteffect manager.
SiliconStudio.Core.Mathematics.Vector3 Vector3
readonly Texture Texture
The underlying texture.
Definition: RenderTarget.cs:17
RenderPass is a hierarchy that defines how to collect and render meshes.
Definition: RenderPass.cs:19