withUnusedColorAttachment() adds a null entry, but the RenderPassDescriptor canonical constructor runs List.copyOf, which rejects nulls with an NPE. If that is fixed, the GL backend then fails: glDrawBuffers names slots that have no attachment, leaving the FBO in GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER . Vulkan handles both. the fix is to emit GL_NONE for the empty slots
Can confirm.