I want to create a watersurface with airbubbles and white foam + wave produced by the air bubbles.

I know i can use particles for air bubbles underneath the watersurface. But how to get the little bubbles above the surface + the foam like shown in the picture?

enter image description here

I got this so far. Any suggestions? It doesn't look quite real.

enter image description here

  • 3
    $\begingroup$ Hi :), in some other projects i used dynamic paint for the wave effect but i can only use it ones. I have not even a idea how to archive the white foam or even the multiple bubble interaction with the surface. Maybe the small circles i can add with some texture shader cheating. :D $\endgroup$
    – evev
    Commented Jul 3, 2020 at 19:01
  • $\begingroup$ but this will be a hard one $\endgroup$
    – evev
    Commented Jul 3, 2020 at 19:10
  • $\begingroup$ I have an example above. But it doesn't look real $\endgroup$
    – evev
    Commented Jul 3, 2020 at 19:35
  • $\begingroup$ there schould be small bubbles in between the foam too $\endgroup$
    – evev
    Commented Jul 3, 2020 at 19:44
  • 1
    $\begingroup$ I'm working on a shader for this, but it will likely take me all night. Check back tomorrow. $\endgroup$ Commented Jul 4, 2020 at 3:19

1 Answer 1


Ok, so here's my attempt at your shader. I did my best to recreate what I saw were the most standout features of the photo, namely a relatively calm water surface with a disturbance in the center with bubbles forming somewhat of a ring around the disturbance and some foam appearing in the center. This all accompanied by some slight ripples coming from the side.


This may be not exactly what you're looking for , but hopefully you'll be able adapt enough of the methods outlined to suit your needs. The graph is mainly created from many different noise textures each with varying size and detail. I also used some gradient textures to get shapes such as the inner disruption circle, the ripples, and the area what the ripples are allowed to effect.

First off, I needed the center area, and it needed to not be a perfect circle, as water disturbances are much more random. I chose to get a circle by combining a spherical gradient with a greater than math node - Changing the threshold changes the size of the circle. To make the shape more random, I used the values from a noise texture to warp the vector if the input coordinate, so when I use the result of the "warp" as a vector input for the gradient texture(s), the result comes out appropriately warped. See below:


I then subtracted slightly smaller versions of the same texture from the original to leave me with two "warped rings" of different thicknesses. I used these to form the foam ring. I made the thicker ring slightly darker than the thin one before I mixed, because I plan on using this ring as height information for the "disruption outline" and the variance in brightness of the two rings helps give a more even falloff.

I admit, that I am not particularly happy with the way this "ring falloff" turned out, however, I predict it would take me several more hours to get it just right, and I feel like I've been messing with this graph forever. I don't like how harsh the transition is between the turbulent and calm areas - I just couldn't get it right in time. However, here are some of the steps I took to mitigate the "harshness" of the edge. The first thing I did was to multiply the pure white "ring "with a rather large noise texture to soften some of the edges, and remove some others.


I then multiplied it with a couple of different (highly scaled) noise textures that I clamped rather tightly with ColorRamps, to remove a good deal of small black areas to form the "spots" in the foam ring.

Speaking of foam, I used three different noise textures of varying sizes and positions, subtracted from each other to leave only a few white blotches. I then applied the same technique I used for the ring to soften the edges and add spots. Then I mixed them together. Keep in mind that I still have the original "disruption area" black and white cutout shapes. In any place where I need things to be contained by/excluded from this area, I can either accomplish this my mixing the values with one of these maps (or the inverse of it), or by using it as a mix factor. In most of the cases in this graph, I opted to add and subtract values to and from these maps, because doing it this way gave me better manual control over the mix factor. The result of the ring/foam mix looks like this:


While discussing isolating sections, I should mention that I made the most use of this while creating the height information. Outside the "disturbance" I wanted a water-like, but relatively smooth surface. I did this by multiplying a (brightened and softened) noise map with the inverse of one of the original "disturbance shapes" to make it only affect the outside area.

I did a similar thing to define the inner ripples, however I used a distorted noise texture mixed with a musgrave texture to give a more "turbulent look". I then mixed these two together.


To make the ripples, I used a wave texture set to circular, mixed with a diagonal gradient that I had warped using the method I mentioned at the beginning. I multiplied these together to give an area where the ripples are allowed to appear (in real life they would both transfer across the turbulence, but also be disrupted by it ).


I then mixed these ripples with the height information I made previously to make what would be the final height map. As per convention with procedural textures, I plugged in the height map to the height input of a bump node. I then used this as my normal input. Note that I reduced the strength substantially because the default of 1 is almost always too high (I used 0.1). I also connected this to a displacement node, but I did not use it in my final substance because to be honest I feel that it makes some things look better, while making other things look worse. Play with it if you want, just note that when I had the displacement connected, the graph seemed to take an inordinate amount of time to recalculate. I don't know if that's just my PC acting strange, or it's inherent to the graph. Either way, tread lightly.

To add some finishing touches, I used some of the whites from the "foam" that I had made to make a simple roughness map. I also mixed the basecolor image with a bit of blue increased the metallic value a little to make the water seem more of a "deep blue". The final result looks like this:


I'll also include the .blend file, feel free to tinker with it as much as you like. I tried to label the graph in the most self-explanatory way, so hopefully you can figure out what everything does.

File is here -

Sorry for the wait. Hope this helps.

  • $\begingroup$ Christopher that's awesome! And for sure a lot of work.I played a little bit with your shader and think i can learn alot from it! Anyway the main features so far are self explaned. I will get a deeper look in it in the evening and will come back for a report! $\endgroup$
    – evev
    Commented Jul 5, 2020 at 5:42
  • $\begingroup$ Glad you like. I'm mostly happy with it, but there are things that can be better. When I have some more time, I'll play with it some more and if I manage to make any improvements, I'll post it here, $\endgroup$ Commented Jul 5, 2020 at 5:46
  • $\begingroup$ I'm sure if you take your time it will improve and looks realy real. I also give my best to play around with it and post my result. Maybe with particles as bubbles it would come close. Model of the bubbles with smaller bubbles around and white foam. Maybe 5 examples and set it in a particlesystem. Draw the weights for the appearance. Randome direction + randome size. $\endgroup$
    – evev
    Commented Jul 5, 2020 at 5:50
  • $\begingroup$ I will have a lot of fun with it :D $\endgroup$
    – evev
    Commented Jul 5, 2020 at 5:56
  • $\begingroup$ Chris, this is just amazing!!!!!! $\endgroup$
    – Chris
    Commented Feb 22, 2021 at 11:44

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .