/// <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); }
/// <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; }