Beispiel #1
0
        /// <inheritdoc />
        public override void Compile()
        {
            if (_id == 0)
            {
                _window = ScreenWindow;
            }
            if (_window != null)
            {
                Size = new Vector2(_window.Width * _windowScale, _window.Height * _windowScale);
            }

            base.Compile();
            _id = GL.GenFramebuffer();
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, _id);

            var enums = new DrawBuffersEnum[ColorAttachments.Count];
            var c     = 0;

            foreach (var pair in ColorAttachments)
            {
                pair.Value.Generate(this);

                enums[c++] = pair.Value.DrawBuffersEnum;
            }

            GL.DrawBuffers(enums.Length, enums);
            foreach (var pair in ColorAttachments)
            {
                GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, pair.Value.FramebufferAttachment, pair.Value.Target, pair.Value.ID,
                                        0);
            }
            FramebufferErrorCode err;

            err = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer);
            if (err != FramebufferErrorCode.FramebufferComplete)
            {
                throw new Exception("Failed loading framebuffer.\nProblem: " + err);
            }

            foreach (RenderbufferAttachment attachment in RenderbufferAttachments)
            {
                attachment.Generate(this);
                GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, attachment.FramebufferAttachment, RenderbufferTarget.Renderbuffer, attachment.ID);
            }

            err = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer);
            if (err != FramebufferErrorCode.FramebufferComplete)
            {
                throw new Exception("Failed loading framebuffer.\nProblem: " + err);
            }

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
            GL.BindTexture(TextureTarget.Texture2D, 0);
        }
        /// <summary>
        /// This creates a finished setup for a framebuffer.
        /// </summary>
        public static Framebuffer CreateWindowFramebuffer(IFramebufferWindow window, int multisamples = 0, PixelInformation?pixelInformation = null, bool depth = true)
        {
            Framebuffer framebuffer = new Framebuffer(window);

            framebuffer.Append("color", new ColorAttachment(0, pixelInformation.GetValueOrDefault(PixelInformation.RGBA_LDR), multisamples: multisamples));

            if (depth)
            {
                RenderbufferAttachment depthAttach = RenderbufferAttachment.GenerateDepth();
                depthAttach.Multisample = multisamples;
                framebuffer.AppendRenderbuffer(depthAttach);
            }

            return(framebuffer);
        }
Beispiel #3
0
 /// <summary>
 /// Creates a buffer, while always respecting the screen.
 /// </summary>
 /// <param name="window"></param>
 /// <param name="scale"></param>
 public Framebuffer(IFramebufferWindow window, float scale = 1) : this(new Vector2(window.Width * scale,
                                                                                   window.Height *scale))
 {
     _window      = window;
     _windowScale = scale;
 }