A framebuffer describes destinations
A framebuffer object connects attachment images to rendering operations. A texture or renderbuffer provides their storage. Give the observatory an offscreen color texture and depth attachment, check completeness after construction, and document their dimensions and formats. A generated framebuffer name alone does not establish a usable render target.
A resize is another transaction: validate the new dimensions, construct a complete candidate target, then replace the old one. Preserve a usable target if allocation or completeness fails. Handle zero framebuffer size while minimized without constructing zero-sized resources or computing an invalid aspect ratio.
Set viewport and required state at each pass boundary. Render the room into the offscreen target, then bind the presentation target and draw a fullscreen primitive sampling the completed color image. Do not sample from an attachment being written by the same draw; that feedback is not a general legal shortcut.
Implement one color-plus-depth target. Test resizing, minimize/restore, and an intentionally incomplete candidate without losing the last usable target.
