I started this project for the monthly render challenge on the Blender discord last March, where the topic was Alien Worlds. I decided to go with a Foundation-inspired jumpship design and played some “random bullshit go” with Random Flow and some good ol’ JSplacement textures.
The actually interesting part of this project however was not the spaceship itself, but the background. I had worked on a procedural planet shader before (with faux atmosphere, rayleigh scattering and cloud shadows for real-time capabilities) and wanted to create a 100% procedural background HDRI shader for this project.
So I created a modular HDRI shader that essentially projects the procedural planet surface onto the background in a way that makes it look like there is a planet in the distance (even though there isn’t). Then I sprinkled fake lighting, scattering and atmosphere effects over it with some more shader magic.
This has a couple of benefits:
it doesn’t require actual high-resolution geometry for a planet
your scene scale doesn’t need to be huge to account for the scale difference between planet and spaceship (the HDRI is always infinitely far away)
you get global illumination by the procedural HDRI for free
no volumetrics needed for cloud or atmosphere, so rendering is pretty fast and would even work in Eevee (if the shader compilation was a bit faster)
you can easily tweak the orbital height and all other parameters from one single group:
So yeah, I really need to get back to this project and clean up the node graph and make it actually usable. I also need to improve the UV projection so that one can properly use image textures instead of procedural textures for terrain and clouds.
Thank you! Yes, eventually I am going to upload it to Blendermarket, maybe as a free update to my existing planet shader, which currently only works as a material shader and not as an HDRI.
Oh my gosh this is phenomenal! I have tried working on something similar, not this realistic tho. I only focused on the geometric representation of specifying the size of the globe and it’s desired distance from the Camera/World Origin, generating fake spherical texture coordinates on the World Background. Aside from that all I did was put basic fake shading on it, just rotating one of the vectors which happens to accurately match shading on a sphere. Does this setup take into account the perspective of the globe? I’m curious because I was only able to get my perspective very close to the way it should be but not 100% accurate when compared to a real sphere for comparison in the same scene. Couldn’t for the life of me figure out the exact string of Math Nodes needed to get the perspective completely accurate.
Actually, getting the correct spherical coordinates in perspective is still on the todo list. I started this shader with a close to the surface scenario, where the noise scale can be driven by one over the Z coordinates to get the perspective of a plane. If you then move the coordinates away from the center, you get something that somewhat resembles spherical coordinates, especially when changing the falloff function to something nonlinear.
My approach usually is to make shit up until it looks good, and not necessarily to figure out the mathematically accurate solution. But in this case I might have to go back to the drawing board and actually figure out the correct math. Totally looking forward to that… ^^
Ohh iiiinteresting. Nice. It’s hard to make out your node tree in your earlier image but I wonder how similar it is to my setup, coz I also primarily use the Z, basically cutting a circle out at any size I want, I think by like subtracting (I have to look at my file again), using a Math Node set to like Power or something, then I also use that to distort the X and Y.
I don’t cut away anything in a circle, instead I move around the center of the background’s coordinate system, which probably does more or less the same:
There’s an input Z value before that that shifts the whole coordinate system away, as you can see here:
You can also see that I haven’t optimized the whole shadow calculation thing yet, it breaks apart at larger distances (I essentially haven’t touched it since March), and the terrain here is also still tweaked to be a tidally locked planet with the green band along the terminator.
Oh that is interesting! Yeah, seems to be a somewhat different technique than mine. I’m just in awe especially over your shading with the clouds. Actually I have two questions: How do you implement the clouds and atmosphere themselves? I can see there’s no volume output, so do you use White Noise?; And, how did you accomplish the topographic shading? I tried putting my system through a Bump or Displacement node, but it didn’t treat my faked normals the way it treats normals on a real mesh.
Soooo I think I wrote my own bump mapping with vector math to get the shadows on the clouds. The shadows that the clouds cast onto the surface is just a copy of the same noise with a slight shift.
And yes, the clouds and the terrain are both just different kinds of random noise, encapsulated into a group that allows me to re-use the same noise setup multiple times within the big shader graph (I like to call them containers).
And the atmosphere is essentially an exponential falloff function using the Z coordinates as input. I don’t like to use gradient textures for these, as they tend to have a very harsh cut-off at the ends.