For this update, we have our technical artist/programmer/wunderkind Logan discussing how he created the new atmosphere shader for Outer Wilds. Take it away, Logan!
My first step in approaching the challenge of planetary atmosphere in Outer Wilds was to start reading papers. Lots and lots of papers. After a week of filling my brain with Rayleigh and Mie scattering, 4-dimensional textures, and raymarching, I was completely fried. There were a lot of different approaches out there, but a lot of them managed end-runs around the difficult parts by simply finding ways to not do them. A lot of atmosphere shaders were split into separate parts that only worked on the ground or space, or that were hardcoded to specific thickness ratios, or that relied on the planet not being any more complicated than a perfect sphere sitting completely still in space.
For Outer Wilds, we needed a single solution that would look good from outside, on the ground, and every point inbetween (and then some). It also had to work on multiple planets zipping around in orbit. Additionally, since a big part of Outer Wilds is real-world phenomena appearing in our systems (like the Coriolis effect), I wanted it to realistically simulate light scattering to at least some degree.
Sean O'Neil's work (found in GPU Gems 2) was particularly helpful in finding our own solution. Although our approach is similar (we sum up samples of the atmosphere along a ray from the camera to the far position), I replaced a vast majority of his equations with my own, and added even more to combine his multiple-shader approach into a single one. Ultimately, we found a happy balance between artistic control and simulation, and we're still regularly ooh-ing and aah-ing at the results!
Thanks, Logan! We've done most our testing in Timber Hearth, and the team cannot wait to implement it across the Solar System!
Updates on our games, our process, and the joys of being Mobius Digital.