4 using System.Collections.Generic;
6 using SiliconStudio.Paradox.DataModel;
7 using SiliconStudio.Paradox.Effects.Data;
8 using SiliconStudio.Paradox.Effects.Modules;
9 using SiliconStudio.Paradox.Games;
10 using SiliconStudio.Paradox.Graphics;
11 using SiliconStudio.Core;
12 using SiliconStudio.Core.Mathematics;
13 using SiliconStudio.Paradox.Shaders;
15 namespace SiliconStudio.
Paradox.Effects
22 private EffectOld lightShaftsEffect;
42 BoundingBoxes =
new List<Mesh>();
43 LightColor =
new Color3(1, 1, 1);
44 ExtinctionFactor = 0.001f;
45 ExtinctionRatio = 0.9f;
46 DensityFactor = 0.01f;
56 return Parameters.TryGet(LightKeys.LightColor);
60 Parameters.Set(LightKeys.LightColor, value);
64 public float ExtinctionFactor
68 return Parameters.TryGet(PostEffectLightShaftsKeys.ExtinctionFactor);
72 Parameters.Set(PostEffectLightShaftsKeys.ExtinctionFactor, value);
76 public float ExtinctionRatio
80 return Parameters.TryGet(PostEffectLightShaftsKeys.ExtinctionRatio);
84 Parameters.Set(PostEffectLightShaftsKeys.ExtinctionRatio, value);
88 public float DensityFactor
92 return Parameters.TryGet(PostEffectLightShaftsKeys.DensityFactor);
96 Parameters.Set(PostEffectLightShaftsKeys.DensityFactor, value);
100 public int StepCount {
get; set; }
113 public List<Mesh> BoundingBoxes {
get;
private set; }
119 boundingBoxPass =
new RenderPass(
"BoundingBoxPass");
121 lightShaftPass =
new RenderPass(
"LightShaftPass");
122 filterUpscalePass =
new RenderPass(
"UpscalePass");
123 RenderPass.AddPass(boundingBoxPass, minMaxPass, lightShaftPass, filterUpscalePass);
125 var useUpScaling =
false;
129 EnableSetTargets =
true,
130 EnableClearTarget =
true,
135 var minMaxEffectBuilder = this.EffectSystemOld.BuildEffect(
"MinMax")
137 .Using(
new BasicShaderPlugin(
"TransformationWVP") {
RenderPassPlugin = bbRenderTargetPlugin });
140 var minmaxEffectBuilder = this.EffectSystemOld.BuildEffect(
"LightShaftsMinMax")
142 .Using(
new BasicShaderPlugin(
"ForwardShadowMapBase") {
RenderPass = minMaxPass })
143 .Using(
new BasicShaderPlugin(
new ShaderClassSource(
"PostEffectMinMax",
"ShadowMapUtils.shadowMapTexture",
"PointSampler", 4, 4, 0.0, 1.0)) {
RenderPass = minMaxPass });
145 var lightShaftsEffectBuilder = this.EffectSystemOld.BuildEffect(
"LightShafts")
149 .Using(
new BasicShaderPlugin(
new ShaderClassSource(
"PostEffectLightShafts", Debug ? 1 : 0,
false ? 1 : 0, StepCount)) {
RenderPass = lightShaftPass });
151 if (OfflineCompilation)
153 minMaxEffectBuilder.InstantiatePermutation();
154 minmaxEffectBuilder.InstantiatePermutation();
155 lightShaftsEffectBuilder.InstantiatePermutation();
159 Parameters.AddSources(ViewParameters);
160 Parameters.Set(RenderTargetKeys.DepthStencilSource, DepthStencil.Texture);
161 Parameters.Set(TexturingKeys.Sampler, GraphicsDevice.SamplerStates.PointClamp);
164 var gbufferDesc = RenderTarget.Description;
165 var bbRenderTarget = Texture2D.New(
GraphicsDevice, gbufferDesc.Width / 8, gbufferDesc.Height / 8, PixelFormat.R32G32_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget);
168 bbRenderTargetPlugin.RenderTarget = bbRenderTarget.ToRenderTarget();
169 bbRenderTargetPlugin.Parameters.AddSources(Parameters);
170 bbRenderTargetPlugin.Apply();
172 EffectOld minMaxEffect = minMaxEffectBuilder.InstantiatePermutation();
175 foreach (var bbMeshData
in BoundingBoxes)
178 var bbMesh =
new EffectMesh(minMaxEffect, bbMeshData).KeepAliveBy(
this);
181 RenderSystem.GlobalMeshes.AddMesh(bbMesh);
185 var minMaxRenderTarget = Texture2D.New(
GraphicsDevice, 256, 256, PixelFormat.R32G32_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget);
187 minMaxPass.Parameters.AddSources(ShadowMap.Parameters);
188 minMaxPass.Parameters.AddSources(Parameters);
189 minMaxPass.Parameters.AddDynamic(PostEffectMinMaxKeys.MinMaxCoords, ParameterDynamicValue.New(LightingPlugin.CascadeTextureCoords, (ref
Vector4[] cascadeTextureCoords, ref
Vector4 output) =>
191 output = cascadeTextureCoords[0];
192 }, autoCheckDependencies:
false));
194 EffectOld minmaxEffect = minmaxEffectBuilder.InstantiatePermutation();
196 var minMaxMesh =
new EffectMesh(minmaxEffect).KeepAliveBy(
this);
197 minMaxMesh.Parameters.Set(RenderTargetKeys.RenderTarget, minMaxRenderTarget.ToRenderTarget());
198 RenderSystem.GlobalMeshes.AddMesh(minMaxMesh);
202 blendStateDesc.SetDefaults();
203 blendStateDesc.AlphaToCoverageEnable =
false;
204 blendStateDesc.IndependentBlendEnable =
false;
205 blendStateDesc.RenderTargets[0].BlendEnable =
true;
207 blendStateDesc.RenderTargets[0].AlphaBlendFunction = BlendFunction.Add;
208 blendStateDesc.RenderTargets[0].AlphaSourceBlend = Blend.One;
209 blendStateDesc.RenderTargets[0].AlphaDestinationBlend = Blend.One;
211 blendStateDesc.RenderTargets[0].ColorBlendFunction = BlendFunction.Add;
212 blendStateDesc.RenderTargets[0].ColorSourceBlend = Blend.One;
213 blendStateDesc.RenderTargets[0].ColorDestinationBlend = Blend.One;
217 var additiveBlending = BlendState.New(GraphicsDevice, blendStateDesc);
218 additiveBlending.Name =
"LightShaftAdditiveBlend";
220 var shaftRenderTarget = useUpScaling ? Texture2D.New(GraphicsDevice, gbufferDesc.Width / 2, gbufferDesc.Height / 2, PixelFormat.R16G16B16A16_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget).ToRenderTarget() :
RenderTarget;
224 lightShaftPass.Parameters.AddSources(ShadowMap.Parameters);
225 lightShaftPass.Parameters.AddSources(Parameters);
227 this.lightShaftsEffect = lightShaftsEffectBuilder.InstantiatePermutation();
230 var mesh =
new EffectMesh(lightShaftsEffect).KeepAliveBy(
this);
231 mesh.Parameters.Set(TexturingKeys.Texture0, minMaxRenderTarget);
232 mesh.Parameters.Set(TexturingKeys.Texture1, bbRenderTarget);
233 mesh.Parameters.Set(RenderTargetKeys.RenderTarget, shaftRenderTarget);
237 mesh.Parameters.Set(EffectPlugin.BlendStateKey, additiveBlending);
239 RenderSystem.GlobalMeshes.AddMesh(mesh);
244 var bbRenderTargetUpScaleH = Texture2D.New(GraphicsDevice, gbufferDesc.Width, gbufferDesc.Height / 2, PixelFormat.R16G16B16A16_Float, TextureFlags.ShaderResource | TextureFlags.RenderTarget);
248 var blurEffects =
new EffectOld[] {
249 this.EffectSystemOld.BuildEffect(
"BilateralGaussianFiltering")
251 .Using(
new BasicShaderPlugin(
new ShaderClassSource(
"PostEffectBilateralGaussian", 0))),
252 this.EffectSystemOld.BuildEffect(
"BilateralGaussianFiltering")
255 .Using(
new BasicShaderPlugin(
new ShaderClassSource(
"PostEffectBilateralGaussian", 1))),
259 Texture2D textureSourceV = bbRenderTargetUpScaleH;
260 RenderTarget renderTargetH = bbRenderTargetUpScaleH.ToRenderTarget();
263 var blurQuadMesh =
new EffectMesh[2];
264 for (
int i = 0; i < 2; ++i)
266 blurQuadMesh[i] =
new EffectMesh(blurEffects[i]).KeepAliveBy(
this);
267 filterUpscalePass.AddPass(blurQuadMesh[i].EffectPass);
268 RenderSystem.GlobalMeshes.AddMesh(blurQuadMesh[i]);
271 blurQuadMesh[0].Parameters.Set(TexturingKeys.Texture0, textureSourceH);
272 blurQuadMesh[1].Parameters.Set(TexturingKeys.Texture0, textureSourceV);
273 blurQuadMesh[0].Parameters.Set(RenderTargetKeys.RenderTarget, renderTargetH);
274 blurQuadMesh[1].Parameters.Set(RenderTargetKeys.RenderTarget, renderTargetV);
277 blurQuadMesh[1].Parameters.Set(EffectPlugin.BlendStateKey, additiveBlending);
284 internal static readonly
ParameterKey<Vector3> ShadowLightOffset = ParameterKeys.Value(ParameterDynamicValue.New<
Vector3, ShadowMapData>(LightingPlugin.ViewProjectionArray, CalculateShadowLightOffset));
289 internal static readonly
ParameterKey<Matrix> ShadowViewProjection = ParameterKeys.Value(ParameterDynamicValue.New<
Matrix, ShadowMapData>(LightingPlugin.ViewProjectionArray, CalculateShadowViewProjection));
294 internal static readonly
ParameterKey<Vector4> ShadowTextureFactor = ParameterKeys.Value(ParameterDynamicValue.New<
Vector4,
Vector4[]>(LightingPlugin.CascadeTextureCoords, CalculateShadowTextureFactor));
296 private static void CalculateShadowViewProjection(ref ShadowMapData cascadeData, ref
Matrix output)
298 output = cascadeData.ViewProjCaster0;
301 private static void CalculateShadowLightOffset(ref ShadowMapData cascadeData, ref
Vector3 output)
303 output = cascadeData.Offset0;
306 private static void CalculateShadowTextureFactor(ref
Vector4[] textureCoords, ref
Vector4 output)
308 output = textureCoords[0];
Key of an effect parameter.
A renderable texture view.
LightShaftsPlugin()
Initializes a new instance of class LightShaftsPlugin.
Represents a color in the form of rgb.
Basic shader plugin built directly from shader source file.
Represents a three dimensional mathematical vector.
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.
Represents a four dimensional mathematical vector.
LightShaftsPlugin(string name)
Initializes a new instance of class LightShaftsPlugin.
A Texture 2D frontend to SharpDX.Direct3D11.Texture2D.
Level10 render pass using a depth buffer and a render target.
ColorWriteChannels
Identify which components of each pixel of a render target are writable during blending.
SiliconStudio.Core.Mathematics.Vector3 Vector3
override void Initialize()
RenderPass is a hierarchy that defines how to collect and render meshes.
A container to handle a hierarchical collection of effect variables.
A shader class used for mixin.
Represents a 4x4 mathematical matrix.