private void CombineResult(TargetResourceTexture target, TargetResourceTexture light, TargetResourceTexture reflection,
TargetResourceTexture bottomLayer = null, DepthStencilView limitedBy = null) {
DeviceContextHolder.QuadBuffers.Prepare(DeviceContext, _deferredResult.LayoutPT);
DeviceContext.OutputMerger.BlendState = null;
if (limitedBy == null) {
DeviceContext.OutputMerger.SetTargets(target.TargetView);
} else {
DeviceContext.OutputMerger.SetTargets(limitedBy, target.TargetView);
DeviceContext.OutputMerger.DepthStencilState = DeviceContextHolder.GreaterReadOnlyDepthState;
}
DeviceContext.ClearRenderTargetView(target.TargetView, ColorTransparent);
_deferredResult.FxWorldViewProjInv.SetMatrix(Camera.ViewProjInvert);
_deferredResult.FxScreenSize.Set(new Vector4(Width, Height, 1f / Width, 1f / Height));
_deferredResult.FxBaseMap.SetResource(_gBufferBase.View);
_deferredResult.FxNormalMap.SetResource(_gBufferNormal.View);
_deferredResult.FxMapsMap.SetResource(_gBufferMaps.View);
_deferredResult.FxDepthMap.SetResource(_gDepthBuffer.View);
_deferredResult.FxEyePosW.Set(Camera.Position);
_deferredResult.FxLightMap.SetResource(light?.View);
_deferredResult.FxLocalReflectionMap.SetResource(reflection?.View);
_deferredResult.FxBottomLayerMap.SetResource(bottomLayer?.View);
_deferredResult.FxReflectionCubemap.SetResource(_reflectionCubemap.View);
EffectTechnique tech;
switch (Mode) {
case RenderingMode.DebugGBuffer:
tech = _deferredResult.TechDebug;
break;
case RenderingMode.DebugPostEffects:
tech = _deferredResult.TechDebugPost;
break;
case RenderingMode.DebugLighting:
tech = _deferredResult.TechDebugLighting;
break;
case RenderingMode.DebugLocalReflections:
tech = _deferredResult.TechDebugLocalReflections;
break;
case RenderingMode.Result:
case RenderingMode.WithoutTransparent:
tech = _deferredResult.TechCombine0;
break;
default:
return;
}
tech.DrawAllPasses(DeviceContext, 6);
if (limitedBy != null) DeviceContext.OutputMerger.DepthStencilState = null;
}