[HN Gopher] Analytic Fog Rendering with Volumetric Primitives (2...
___________________________________________________________________
Analytic Fog Rendering with Volumetric Primitives (2025)
Author : surprisetalk
Score : 75 points
Date : 2026-03-05 16:12 UTC (1 days ago)
(HTM) web link (matejlou.blog)
(TXT) w3m dump (matejlou.blog)
| kqr wrote:
| If, by chance, there are any fans of _Morrowind_ here, there are
| shaders for the OpenMW source port that add volumetric fog and
| the game becomes absolutely stunning with them. I 'm sure that
| was what the original developers intended but couldn't achieve
| with the computers of the age.
|
| Volumetric fog has a special place in my heart.
| maximus_prime wrote:
| Shout-out to his incredible mod adds volumetric fog to GTA 4:
| https://fusionfix.io/iv
| bee_rider wrote:
| This is pretty cool, and also seems pretty accessible for a
| "graphics thing." Just a little calculus.
|
| It would be kind of neat to have an example of a physical
| situation that produces each of the example functions (although
| I'm sure that isn't always possible).
|
| Can the effect of multiple fog emitters reasonably be modeled as
| the sum of their outputs? I guess for high densities, probably
| not (eventually the air will get saturated), but for low
| densities, probably yes...
| reactordev wrote:
| Yesssssss...
|
| However, I'd push this a little further with light reflectance
| and scattering. Fog does some weird things to light when it's
| dense. You mention this towards the end but even just a Rayleigh
| calc should be enough.
|
| A goal of mine, maybe this year, is to get back into volumetric
| clouds and fog using SDF with wgpu but, the economy.
|
| But something like... // Assume: //
| vec3 fogColor; // Base fog color // float density;
| // Fog density at point // vec3 lightDir; //
| Direction from point to light // vec3 viewDir; //
| Direction from camera to point // vec3 sunColor; //
| RGB color of light // Compute angle between light
| and view float cosTheta = dot(normalize(lightDir),
| normalize(viewDir)); // Simple Rayleigh-ish phase
| function (forward/backward scattering) float phase = 0.75
| * (1.0 + cosTheta * cosTheta); // Wavelength-
| dependent scattering (approx Rayleigh) vec3 sigma =
| vec3(0.5, 0.8, 1.0); // R,G,B scattering coeffs //
| Fog contribution vec3 fogContribution = density * phase *
| sigma * sunColor; // Blend with scene color
| (sceneColor comes from existing render) vec3 finalColor =
| mix(sceneColor, sceneColor + fogContribution, density);
|
| Take that with a grain of salt but the idea is to blend the final
| color with a scattering coefficient for when light is trying to
| shine through.
___________________________________________________________________
(page generated 2026-03-06 23:00 UTC)