static (IHostScreen Screen, FBO Fbo, TextureObject DepthTex, Vector2i Size) Create(int width, int height) { var screen = Engine.GetValidCurrentContext(); var size = new Vector2i(width, height); var depth = TextureObject.Empty; var fbo = FBO.Empty; try { depth = TextureObject.Create(); TextureObject.Bind2D(depth); TextureObject.DepthImage2DUninitialized(size); TextureObject.Parameter2DMinFilter(TextureShrinkMode.NearestNeighbor, TextureMipmapMode.None); TextureObject.Parameter2DMagFilter(TextureExpansionMode.NearestNeighbor); TextureObject.Parameter2DWrapS(TextureWrapMode.ClampToBorder); TextureObject.Parameter2DWrapT(TextureWrapMode.ClampToBorder); fbo = FBO.Create(); FBO.Bind(fbo, FBO.Target.FrameBuffer); FBO.SetTexture2DBuffer(depth, FBO.Attachment.DepthAttachment); GL.DrawBuffer(DrawBufferMode.None); GL.ReadBuffer(ReadBufferMode.None); FBO.ThrowIfInvalidStatus(); FBO.Unbind(FBO.Target.FrameBuffer); return(Screen : screen, Fbo : fbo, DepthTex : depth, Size : size); } catch { TextureObject.Delete(ref depth); FBO.Delete(ref fbo); throw; } }