Create Postprocessing Graph from code
Although we recommend to create PostProcessing using Evergine Studio, you can achieve this task from code. The following sample code can be used to create a new postprocessing graph and apply it to an entity in your scene.
protected override void CreateScene()
{
    var graphicsContext = Application.Current.Container.Resolve<GraphicsContext>();      
    // Create compute effect
    var shaderSource = @"
                [Begin_ResourceLayout]
                    Texture2D input : register(t0);
                    RWTexture2D<float4> Output : register(u0);
                    SamplerState Sampler : register(s0);
                [End_ResourceLayout]
                [Begin_Pass:Default]
                    [Profile 11_0]
                    [Entrypoints CS = CS]
                    [numthreads(8, 8, 1)]
                    void CS(uint3 threadID : SV_DispatchThreadID)
                    {
                        float2 outputSize;
                        Output.GetDimensions(outputSize.x, outputSize.y);
                        float2 uv = (threadID.xy + 0.5) / outputSize;		
                        float4 color = input.SampleLevel(Sampler, uv, 0);
                        Output[threadID.xy] = float4(color.x,0,0,1);	
                    }
                [End_Pass]
                ";
    Effect computeEffect = new EffectFromCode(graphicsContext, shaderSource);
    // Create Postprocessing Graph
    PostProcessingGraphDescription graphDescription = new PostProcessingGraphDescription();
    // Create start node
    PostProcessingNode render = new PostProcessingNode();
    var renderColorTextureOPort = new PostProcessingOutputNodePort("ColorTexture", new PostProcessingNodePortLoadableType<Texture>());
    var renderDepthTextureOPort = new PostProcessingOutputNodePort("DepthTexture", new PostProcessingNodePortLoadableType<Texture>());
    render.AddOutputPort(renderColorTextureOPort);
    render.AddOutputPort(renderDepthTextureOPort);
    graphDescription.StartNode = render;
    render.IntegrityNodeCheck(graphDescription);
    // Create end node
    PostProcessingNode screen = new PostProcessingNode();
    var screenColorTextureIPort = new PostProcessingInputNodePort("ColorTexture", new PostProcessingNodePortLoadableType<Texture>());
    screen.AddInputPort(screenColorTextureIPort);
    graphDescription.EndNode = screen;
    screen.IntegrityNodeCheck(graphDescription);
    // Create my custom node
    PostProcessingNode myNode = new PostProcessingNode(computeEffect);
    myNode.ThreadGroupDivisorX = 8;
    myNode.ThreadGroupDivisorY = 8;
    myNode.ThreadGroupDivisorZ = 1;
    graphDescription.AddNode(myNode);
    // Connect nodes
    myNode.GetInputPortByName("input").AddConnection(new PostProcessingPortConnection(renderColorTextureOPort));
    myNode.GetOutputPortByName("Output").AddConnection(new PostProcessingPortConnection(screenColorTextureIPort));
    PostProcessingGraph graph = new PostProcessingGraph(graphDescription);
    // Add postprocessing graph to scene
    Entity postprocessingVolume = new Entity()
        .AddComponent(new Transform3D())
        .AddComponent(new PostProcessingGraphRenderer() { ppGraph = graph });
    this.Managers.EntityManager.Add(postprocessingVolume);
}