So, I got this working by rendering my game to my own viewport, than putting a script in my viewport container to save a copy of the drawn texture. So far, that's my best solution, but I'd prefer not to be using up the pointless resources of a redundant viewport (and making them play nice given resizing, etc).
I'd really like to just be able to copy the root viewport's frame, but because it has no parent in the root hierarchy, it'll always be already clear by the time my own node scripts are running. Unless... Can I attach my own script to the tree like any other node? Or is there another way I haven't considered?