Something I've vowed several times I'd never do again: hand-paint a skybox.
The outdoor cloud-ish type specifically:
Painting clouds is all fun and fulfilling, until you need to fill out a full 360 degree view with dozens of them.
I preferred to draw a cloud scene as a spherical environment map; stretch around the outer regions is somewhat easier to deal with than the discontinuities along borders of the six faces in a cube map. (I always do my painting in Painter, so no clever 3D painting across seams for me.) Then you get the obvious issues with lighting (time of day etc.), that often require a complete repaint if you do not plan properly.
Anyway, the interface of the 'cloud tracer'-tool as it is now:
options = [ "mesh" => loadmesh([ "path" => "D:/Temp/Cloud.lxo", "mask" => "Bake" ]), "env" => loadimg([ "path" => "D:/Temp/Cloud_Env_2048.exr", "gamma" => 1.0 ]), "coverage" => loadimg([ "path" => "D:/Temp/Cloud_Coverage.png" ]), "normal" => loadimg([ "path" => "D:/Temp/Cloud_Normal.png", "channelmap" => [ 0, 2, 1 ], "levelmin" => -1.0, "levelmax" => 1.0 ]), "density" => 0.025, "densityhaze" => 0.00025, "tilelevelmin" => 0.4, "tilelevelmax" => 1.0];saveimg([ "textures" => tracer(options) ]);
The "mesh":
CREEPY.
I skipped the simulation pass I initially planned on implementing, and simply modelled and replicated a series of basic cloud shapes. These cloud parts are all made up of smaller convex elements, which makes ray-testing fast and robust (occlusion tests against translucent convex objects make up the bulk of the work). I've also been meaning to try and run a radiosity solver on a low-resolution proxy mesh and have its results mapped back onto higher detail geometry - these convex bits seemed like a good candidate.
"environment":
Illumination comes from a single light probe for now.
"coverage"/"normal":
I got to doodle some more clouds by hand: geometry is expanded using these normal mapped 'depth billboards', which then have results from the lighting pass projected onto them. They're cheaper to render than volumetric textures, as there's no ray-marching involved. Also, 2D textures are far more straightforward to produce. I might come back to volume textures for other reasons later though.
Then there's some stuff about global cloud density and fog values for space in the scene that's not occupied by cloud geometry.
LET'S RENDER AND SEE:
k.
- Clouds need to be a bit more whispy here and there.
- The in-modeller point cloud replicator I used does a fairly good job at coming up with interesting cloud shapes, but I feel a custom distributor could still do better.
- The radiosity pass finishes pretty quickly as I had hoped, but tracing the final 2048 * 2048 image takes a while running on the cpu - needs more Compute.
Apologies for all the going back-and-forth with the camera.
Lastly, a bit of blatant self-promotion: I've been looking to do some graphics/tools programming for a U.S./European studio. If anyone can think of someone who might be interested, I'd love to hear (doesn't have to be game related per se).
Bro, that work for the sky is amazing. You are doing some crazy good stuff