public override void Do(PostProcessingRenderObject ro)
        {
            ro.ProcessedViewport = Viewport.Default;
            ro.TextureSize       = ro.Size;
            ro.CurrentBufferSize = (Vector2)ro.SourceTextureBuffer.Size;
            ro.ViewportSize      = (Size)(ro.TextureSize * ro.SourceTextureScaling);
            ro.ProcessedTexture  = ro.SourceTextureBuffer.Texture;
            ro.ProcessedUV1      = (Vector2)ro.ViewportSize / ro.CurrentBufferSize;
            if (!ro.SourceTextureBuffer.IsDirty)
            {
                return;
            }

            ro.PrepareOffscreenRendering(ro.Size);
            ro.SourceTextureBuffer.Texture.SetAsRenderTarget();
            try {
                Renderer.Viewport = new Viewport(0, 0, ro.ViewportSize.Width, ro.ViewportSize.Height);
                Renderer.Clear(ro.TextureClearingColor);
                Renderer.Transform2 = ro.LocalToWorldTransform.CalcInversed();
                ro.Objects.Render();
            } finally {
                ro.SourceTextureBuffer.Texture.RestoreRenderTarget();
                ro.FinalizeOffscreenRendering();
            }
            ro.SourceTextureBuffer.IsDirty = false;
            ro.MarkBuffersAsDirty          = true;
        }
        public override void Do(PostProcessingRenderObject ro)
        {
            ro.FinalizeOffscreenRendering();

            ro.VignetteMaterial.Radius   = ro.VignetteRadius;
            ro.VignetteMaterial.Softness = ro.VignetteSoftness;
            ro.VignetteMaterial.UV1      = Vector2.One / (ro.ProcessedUV1 * ro.VignetteScale);
            ro.VignetteMaterial.UVOffset = ro.VignettePivot / ro.VignetteScale;
            ro.VignetteMaterial.Color    = ro.VignetteColor;
            ro.RenderTexture(ro.TransparentTexture, ro.VignetteMaterial);
        }