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;
11 namespace SiliconStudio.
Paradox.Effects
31 Quality = AOQuality.Medium;
47 public bool UseNormal {
get; set; }
51 public float BlurRadius {
get; set; }
53 public float BlurSharpness {
get; set; }
55 public float Radius {
get; set; }
57 public float Contrast {
get; set; }
59 public float AngleBias {
get; set; }
61 public float Attenuation {
get; set; }
63 public int CountDirection {
get; set; }
65 public int CountStepMax {
get; set; }
72 public override void Load()
77 EffectOld hbaoEffect = this.EffectSystemOld.BuildEffect(
"HBAO")
79 .Using(
new BasicShaderPlugin(
new ShaderClassSource(
"PostEffectHBAO") { GenericArguments =
new object[] { UseNormal ? 1 : 0, (int)Quality } }))
80 .KeepAliveBy(ActiveObjects)
81 .InstantiatePermutation()
82 .KeepAliveBy(ActiveObjects);
86 if (OfflineCompilation)
92 bool halfResAO =
false;
102 var rng =
new Random(0);
104 for (
int i = 0; i < 64 * 64; i++)
106 float angle = (float)(2.0 * Math.PI * rng.NextDouble()) / (
float)HBAO_numDir;
108 (
float)Math.Cos(angle),
109 (float)Math.Sin(angle),
110 (float)rng.NextDouble()
115 var randomTexture = Texture2D.New(
GraphicsDevice, 64, 64, PixelFormat.R32G32B32_Float, tab);
117 var hbaoQuadMesh =
new EffectMesh(hbaoEffect, name:
"HBAO level").KeepAliveBy(ActiveObjects);
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);
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);
139 EffectOld hbaoBlurEffect = this.EffectSystemOld.BuildEffect(
"HBAO Blur")
141 .Using(
new BasicShaderPlugin(
"PostEffectHBAOBlur"))
142 .InstantiatePermutation();
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);
156 var backBuffer = GraphicsDevice.BackBuffer;
157 postEffectsPlugin.AddLink(
159 RenderTargetKeys.RenderTarget,
161 PostEffectHBAOBlurKeys.AmbiantOcclusionTexture,
162 new TextureDescription() { Width = backBuffer.Width >> (halfResAO ? 1 : 0), Height = backBuffer.
Height >> (halfResAO ? 1 : 0), Format = PixelFormat.R8_UNorm });
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);
177 postEffectsPlugin.AddLink(
179 RenderTargetKeys.RenderTarget,
181 PostEffectHBAOBlurKeys.AmbiantOcclusionTexture,
182 new TextureDescription { Width = backBuffer.Width, Height = backBuffer.Height, Format = PixelFormat.R8_UNorm });
184 hbaoBlurQuadMeshY.Parameters.Set(RenderTargetKeys.RenderTarget,
RenderTarget);
187 var effectMeshGroup =
new RenderPassListEnumerator();
188 foreach (var mesh
in postEffectsPlugin.Meshes)
189 RenderSystem.GlobalMeshes.AddMesh(mesh);
192 postEffectsPlugin.Resolve();
199 throw new NotImplementedException();
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
A renderable texture view.
override void Initialize()
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.
RenderTargetsPlugin MainTargetPlugin
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.
SiliconStudio.Core.Mathematics.Vector3 Vector3
readonly Texture Texture
The underlying texture.
RenderPass is a hierarchy that defines how to collect and render meshes.
A shader class used for mixin.