Transmission through water

Hello Radiance community!

I know this topic is a bit of a hot potato, but it seems like most discussions around water are about reflection off the water’s surface, whereas I am interested in transmission through water. There will also be a layer of glass beneath the water. (Imagine looking up to a swimming pool with a glass floor)

So far, my idea is to model water as glass but with RGB transmission values a function of water depth - specifically I have found a nice empirical study relating RGB transmission to penetration depth (admittedly it was with LEDs but the wavelengths aren’t far off the sunlight RGB values):

So my questions are:

  1. Does this even make sense? Are there any other methods I could use? I’d also be interested in comparing and contrasting different methodologies

  2. Is it enough to just use water’s refraction index (ca. 1.33) to account for different angles of incidence? I’m concerned that the larger incidence angles lead to a greater distance travelled through the water, and because the relationship between transmission and penetration depth is negatively exponential (not linear), I wonder if this is captured by Fresnel’s equations… (physics/optics knowledge a little rusty here)

  3. Does anyone have any other sources for RGB transmission values as a function of depth? It would be interesting to compare different sources and see how this uncertainty affects final results.

  4. Are there any other real world factors I’m not considering here? I’m thinking of things like water impurities, ripples on the surface etc – we’re talking about water that will be exposed to the world (i.e. a lake/swimming pool), not some perfect container in a lab.

In summary, unless what I’m proposing is wildly wrong, I’d love to do some comparisons of different approaches, I’m open to anything.

Thank you for any suggestions / comments!
Best,
Joe

Hi Joe,

The physics of dielectrics such as water are well-understood, and the “dielectric” and “interface” materials in Radiance should serve you nicely. Besides the index of refraction, these material types need the transmission per unit length in RGB, and each channel must be between 0 and 1. You should be able to figure this out based on the distance units you are using and the paper you referenced.

If you decide to use a texture or detailed geometry to model waves at the water’s surface, you should get an account of this as well. If you just want a view looking up through the water, then you probably don’t need to worry, but you may need to use volume photon maps to project any caustics (light/shadow projections) you want to see if that is your goal.

Best,
-Greg

1 Like

Two watery renderings from (gasp) 1992!

Water effects simply modelled as a sheet of glass – with ‘texfunc’ applied, IIRC.

1 Like

Wow, nice rendering! Could you proivde the scene files?

Hi Joe,

one problem that occurs if you look at a deeper volume of water is absorption - or the internal transmission per unit length mentioned by Greg. The other is scattering by particles.

In nature, you will find very different values depending on the water, organisms inhabiting it, organic and inorganic substances etc. The paper you linked may give a hint on transmission if you are looking at similar conditions (in particular similar depths). If you are not withing the 0m-3m range, and if you need more than approximations, I would look at spectral measurements in environments that come as close as possible to your case. There is quite a lot of literature about this. Here is a summary of not all that recent data that may be of interest: Optical Absorption of Water Compendium

Best, Lars.

1 Like

Hi Joe,

as Greg mentions, photon mapping does a good job of rendering caustics from water surfaces.

Here’s a piccie I tested the bias compensation with back in 2003. The water surface was obtained from a 2D texture bitmap and fed as floating point values (I forget with what)) into gensurf. The resulting 3D surface was defined as an interface with index of refraction 1.333, as suggested by Greg. To simulate impurities in the water and obtain a “silty” appearance, I defined a mist boundary just below the surface.

This rendering used global, caustic and volume photon mapping in one fell swoop. The caustic photons are responsible for the projected ripples on the bottom and sides, while the volume photons account for indirect inscattering due to impurities (though this contribution is quite minor). The global photons, uh, do all the other stuff.

Note the “patchy” appearance of the caustics; this is a limitation of the statistical model used by the bias compensation. (It was a proof of concept).

Best regards,

–Roland

Thank you all for your detailed comments and renders (some are older than me!)

I should have clarified, I’m not interested (yet) in generating realistic renders, just in the amount of light passing through. If water ripples don’t effect this, then I can ignore it.

Regarding the dielectric material, am I right in thinking the transmission per unit distance is essentially the spectrally averaged values (RGB) of the ‘absorption’ (1/cm) values found in the data Lars linked or in the original paper I mentioned… just want to be sure I’m using the right numbers in the right places.

Thank you!

Hi Greg,

Perhaps I shouldn’t have replied to all without tagging anybody…

Anyway, thanks a lot for your reply; along with your input to another post I’ve made some progress.

In my case I just have three surfaces - ‘water’ dielectric, ‘water/glass’ interface, and ‘glass dielectric’ I’ve then ‘wrapped’ these surfaces with another four to represent opaque walls of the lake (so more like a pool at the moment).
The ‘water’ dielectric is facing up to the air, the ‘glass’ dielectric down to air below. But I wasn’t sure about the normal for the interface, given the order of numbers in the interface modifier:

void interface glass_water
0
0
8
0.98 0.98 0.98 1.5
0.85 0.59 0.73 1.3

void dielectric water
0
0
5 0.85 0.59 0.73 1.3 0

void dielectric glass
0
0
5 0.98 0.98 0.98 1.5 0

My other question regards the transmission per unit length values needed to define the dielectric/interface primitives: I’m not entirely clear how to define these values (and what Radiance is doing with these numbers). Can I use the numbers in the data sources Lars posted (RGB weighted), or the paper I originally linked? Do you mind sharing the data source you used for the glass of wine question? Just to understand things more clearly.

Thanks as always!
Joe

Hi Joe,

Good questions. As stated in the related section of the Radiance user manual, the first set of interface parameters are for the “inside” of a volume and the second set of parameters for the “outside.” In Radiance, the surface normal points towards the outside, so the first 4 parameters correspond to the opposite side of the normal, same as for “dielectric.” The next 4 interface parameters are for the outside. You can point the normal whichever way you like, so long as you associate the correct parameters with each volume for consistent results.

Regarding the transmission per unit distance, the total transmission is essentially the single-unit value to the power of ray distance traveled. A pool of depth 1.0 will have the given transmission. A pool of depth 2.0 will have that transmission squared. A pool of depth 0.5 will have the square root of the specified transmission, and so forth. This is calculated separated for each RGB channel.

I hope this is clear enough (to see through!)
-Greg

Hi Greg,

Thank you, now all the puzzle pieces are coming together!
I made a couple of notes on my understanding of how this coefficient is calculated, and conversion between the coefficient needed by Radiance, and the coefficients reported in the paper I linked in my first post and the data sources Lars cited. Who knows, maybe someone could find it useful one day! (or spot a glaring mistake)

Thank you!
Joe

Hi Joe,

Looks like you got it! It is useful to write these things down.

Cheers,
-Greg

P.S. I made a couple of minor corrections/additions to my earlier response, as it seems I can’t count (parameters).

1 Like