private void Draw(float multipler, int size, int padding, bool fade) {
DeviceContext.ClearRenderTargetView(_summBuffer.TargetView, Color.Transparent);
// draw
var iter = 0f;
for (var k = 0; k < Iterations; k++) {
if (DebugMode) {
DrawShadow(Vector3.UnitY, Vector3.UnitZ);
} else {
var x = MathF.Random(-1f, 1f);
var y = MathF.Random(0.1f, 1f) / MathF.Clamp(DiffusionLevel, 0.001f, 1.0f);
var z = MathF.Random(-1f, 1f);
DrawShadow(new Vector3(x, y, z));
}
AddShadow();
iter++;
}
DeviceContext.OutputMerger.BlendState = null;
_effect.FxSize.Set(new Vector4(Width, Height, 1f / Width, 1f / Height));
// blurring
for (var i = BlurResult ? 2 : 1; i > 0; i--) {
_effect.FxMultipler.Set(i > 1 ? 2f : 1f);
DeviceContext.ClearRenderTargetView(_tempBuffer.TargetView, Color.Transparent);
DeviceContext.OutputMerger.SetTargets(_tempBuffer.TargetView);
_effect.FxInputMap.SetResource(_summBuffer.View);
_effect.TechHorizontalShadowBlur.DrawAllPasses(DeviceContext, 6);
DeviceContext.ClearRenderTargetView(_summBuffer.TargetView, Color.Transparent);
DeviceContext.OutputMerger.SetTargets(_summBuffer.TargetView);
_effect.FxInputMap.SetResource(_tempBuffer.View);
_effect.TechVerticalShadowBlur.DrawAllPasses(DeviceContext, 6);
}
// result
DeviceContext.ClearRenderTargetView(RenderTargetView, Color.Transparent);
DeviceContext.OutputMerger.SetTargets(RenderTargetView);
_effect.FxInputMap.SetResource(_summBuffer.View);
_effect.FxCount.Set(iter / SkyBrightnessLevel);
_effect.FxMultipler.Set(multipler);
_effect.FxPadding.Set(fade ? (float)padding / size : 0f);
_effect.FxShadowSize.Set(new Vector2(_shadowSize.X, _shadowSize.Z) * ClippingCoefficient);
_effect.TechResult.DrawAllPasses(DeviceContext, 6);
}