void SetupEntity(Entity entity) { var cPostProcess = entity.GetComponent <PostProcessComponent>(); cPostProcess.CommandManager.Clear(); var postProcessor = new PostProcessor(Services, cPostProcess.OutputWidth, cPostProcess.OutputHeight); var techniques = cPostProcess.Techniques.ToDictionary(t => t.Name, t => t); var actions = cPostProcess.Actions.ToArray(); foreach (PostProcessAction ppAction in actions) { if (ppAction.AssetName == Param.Engine) { switch (ppAction.Technique) { case Param.EngineActions.RenderSceneToTexture: postProcessor.ProcessAction(ppAction, sceneCommands, cPostProcess.TagFilter); break; } } else { var cModel = entity.GetComponent <ModelComponent>(); Technique effect = techniques[string.Format("{0}.{1}", ppAction.AssetName, ppAction.Technique)]; postProcessor.ProcessAction(ppAction, cModel.Model, effect, entity); } } var commandManager = cPostProcess.CommandManager; commandManager.AddLast(postProcessor.Result()); if (cPostProcess.Target == TargetOutput.Backbuffer) { var lastCommand = commandManager.Last(); commandManager.AddBefore(lastCommand, new ChangeTargetsCommand(Services) { Target = Services.GetService <IGraphicsDeviceService>().DirectXDevice }); } commandManager.Initialize(); var postProcessCommands = commandManager.OfType <IPostProcessCommand>().ToArray(); for (int i = 1; i < postProcessCommands.Length; i++) { var ppAction = actions[i]; postProcessCommands[i].SetInputs(ppAction.InputIndices.Select(idx => postProcessCommands[idx].Output)); } }