private void SetupNonMultisampled() { // Generate FBO if (this.handleMainFBO == 0) { GL.GenFramebuffers(1, out this.handleMainFBO); } GL.BindFramebuffer(FramebufferTarget.Framebuffer, this.handleMainFBO); // Attach textures int oglWidth = 0; int oglHeight = 0; for (int i = 0; i < this.targetInfos.Count; i++) { NativeTexture tex = this.targetInfos[i].Target; FramebufferSlot attachment = (FramebufferSlot)((int)FramebufferSlot.ColorAttachment0 + i); GL.FramebufferTexture2D( FramebufferTarget.Framebuffer, attachment, TextureTarget.Texture2D, tex.Handle, 0); oglWidth = tex.Width; oglHeight = tex.Height; } // Generate or delete depth renderbuffer if (this.depthBuffer) { if (this.handleDepthRBO == 0) { GL.GenRenderbuffers(1, out this.handleDepthRBO); } GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, this.handleDepthRBO); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent24, oglWidth, oglHeight); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, this.handleDepthRBO); } else { GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, 0); if (this.handleDepthRBO != 0) { GL.DeleteRenderbuffers(1, ref this.handleDepthRBO); } this.handleDepthRBO = 0; } // Check status FramebufferErrorCode status = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); if (status != FramebufferErrorCode.FramebufferComplete) { throw new BackendException(string.Format("Incomplete Framebuffer: {0}", status)); } GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, 0); GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); }
void DeleteFBOAttachment(FramebufferSlot attachment) { int param = 0; int objName = 0; GL.GetFramebufferAttachmentParameter(FramebufferTarget.Framebuffer, attachment, FramebufferParameterName.FramebufferAttachmentObjectType, out param); if((int)RenderbufferTarget.Renderbuffer == param) { GL.GetFramebufferAttachmentParameter(FramebufferTarget.Framebuffer, attachment, FramebufferParameterName.FramebufferAttachmentObjectName, out param); objName = param; GL.DeleteRenderbuffers(1, ref objName); } else if((int)All.Texture == param) { GL.GetFramebufferAttachmentParameter(FramebufferTarget.Framebuffer, attachment, FramebufferParameterName.FramebufferAttachmentObjectName, out param); objName = param; GL.DeleteTextures(1, ref objName); } }