Beispiel #1
0
        public void Bind(ISystemOpenGL.Context context)
        {
            // create new framebuffer if it's needed
            // frame buffers are not shared between contexts
            if (!framebuffers.TryGetValue(context, out uint id))
            {
                id = GL.GenFramebuffer();

                GL.BindFramebuffer(GLEnum.FRAMEBUFFER, id);

                // color attachments
                int i = 0;
                foreach (Texture texture in Attachments)
                {
                    if (texture.Implementation is GL_Texture glTexture)
                    {
                        if (texture.Format.IsTextureColorFormat())
                        {
                            GL.FramebufferTexture2D(GLEnum.FRAMEBUFFER, GLEnum.COLOR_ATTACHMENT0 + i, GLEnum.TEXTURE_2D, glTexture.ID, 0);
                            i++;
                        }
                        else
                        {
                            GL.FramebufferTexture2D(GLEnum.FRAMEBUFFER, GLEnum.DEPTH_STENCIL_ATTACHMENT, GLEnum.TEXTURE_2D, glTexture.ID, 0);
                        }
                    }
                }

                framebuffers.Add(context, id);
            }
            else
            {
                GL.BindFramebuffer(GLEnum.FRAMEBUFFER, id);
            }
        }
Beispiel #2
0
 internal ContextMeta GetContextMeta(ISystemOpenGL.Context context)
 {
     if (!contextMetadata.TryGetValue(context, out var meta))
     {
         contextMetadata[context] = meta = new ContextMeta();
     }
     return(meta);
 }
Beispiel #3
0
        protected override void FirstWindowCreated()
        {
            GL.Init(this, System);
            GL.DepthMask(true);

            MaxTextureSize   = GL.MaxTextureSize;
            OriginBottomLeft = true;
            ApiVersion       = new Version(GL.MajorVersion, GL.MinorVersion);
            DeviceName       = GL.GetString(GLEnum.RENDERER);

            BackgroundContext = System.CreateGLContext();
        }
Beispiel #4
0
            static void Clear(GL_Graphics graphics, ISystemOpenGL.Context context, RenderTarget target, Clear flags, Color color, float depth, int stencil, RectInt viewport)
            {
                // update the viewport
                var meta = graphics.GetContextMeta(context);

                {
                    viewport.Y = target.RenderHeight - viewport.Y - viewport.Height;

                    if (meta.Viewport != viewport)
                    {
                        GL.Viewport(viewport.X, viewport.Y, viewport.Width, viewport.Height);
                        meta.Viewport = viewport;
                    }
                }

                // we disable the scissor for clearing
                meta.ForceScissorUpdate = true;
                GL.Disable(GLEnum.SCISSOR_TEST);

                // clear
                var mask = GLEnum.ZERO;

                if (flags.HasFlag(Framework.Clear.Color))
                {
                    GL.ClearColor(color.R / 255f, color.G / 255f, color.B / 255f, color.A / 255f);
                    mask |= GLEnum.COLOR_BUFFER_BIT;
                }

                if (flags.HasFlag(Framework.Clear.Depth))
                {
                    GL.ClearDepth(depth);
                    mask |= GLEnum.DEPTH_BUFFER_BIT;
                }

                if (flags.HasFlag(Framework.Clear.Stencil))
                {
                    GL.ClearStencil(stencil);
                    mask |= GLEnum.STENCIL_BUFFER_BIT;
                }

                GL.Clear(mask);
                GL.BindFramebuffer(GLEnum.FRAMEBUFFER, 0);
            }