/// <inheritdoc/>
        public void SetScissorRectangle(Rectangle? rect)
        {
            Contract.EnsureNotDisposed(this, Disposed);

            if (this.scissorRectangle != rect)
            {
                if (rect == null)
                {
                    gl.Disable(gl.GL_SCISSOR_TEST);
                    gl.ThrowIfError();
                }
                else
                {
                    var rectValue = rect.GetValueOrDefault();
                    if (rectValue.Width < 0 || rectValue.Height < 0)
                        throw new ArgumentOutOfRangeException("rect");

                    var x = rectValue.X;
                    var y = rectValue.Y;
                    ConvertScreenRegionUvToGL(ref x, ref y, rectValue.Width, rectValue.Height);

                    gl.Enable(gl.GL_SCISSOR_TEST);
                    gl.ThrowIfError();

                    gl.Scissor(x, y, rectValue.Width, rectValue.Height);
                    gl.ThrowIfError();
                }
                this.scissorRectangle = rect;
            }
        }