How to Build a Bioluminescent Bay Shader in Blender (Eevee + Cycles)
This is a practical breakdown of a bioluminescent water shader I use for small game and visualization projects. It's not a single download you drop in and forget about — you'll need to build it. The good news is the node setup itself is straightforward. The tricky part is making it look believable without tanking your render time or frame rate. Start with a basic Principled BSDF on your water plane or mesh. The key is splitting the emission into two separate color channels: a deep cyan-green for the base glow and a brighter yellow-white for the high-energy contact points where movement occurs. Here's the core setup:
- Principled BSDF: Set Base Color to a deep teal (#0a3d4a or similar). Set Emission Strength to around 1.5. This gives you the ambient background glow that makes the whole bay look alive at night.
- Add a Noise Texture connected to the Emission Color through a Mix RGB node set to Add. Set the Noise Texture scale to somewhere between 8 and 15 depending on your scene size. Lower scale gives you larger glowing patches. Higher scale gives you speckled plankton-like detail. Use Roughness around 0.6 for a more organic spread.
- Add a second Math node set to Multiply, fed by a Geometry node's Distance output or a Fresnel node. This makes the glow brighter at the edges of ripples and where the water meets surfaces. Real bioluminescence triggers on mechanical disturbance — stirrup shrimp and dinoflagellates flash when they're physically agitated. Your shader should reflect that.
- For the bright white-yellow flares, add a Voronoi Texture with Detail cranked to 10, connected through a Bright/Contrast node, then mixed into the emission via another Mix RGB. Keep the Fac value low — you want sparse hotspots, not a uniformly bright surface.
Switch to Eevee for viewport work. It's fast enough to iterate. For final renders, move to Cycles. The emission nodes behave identically across both engines, but Cycles will handle the indirect bounce light through the glowing water properly, which matters if you have any geometry above or near the surface. One thing people get wrong: they crank the Emission Strength way up and end up with a flat, blown-out surface that looks like a neon sign. The trick is keeping the base emission relatively modest and using the noise/Voronoi layers to create variation. The most convincing shots I've seen have an emission strength between 0.8 and 2.0, with the brightest contacts hitting maybe 3.0 or 4.0 at most. Your eye adapts quickly in a dark scene, so less is almost always more.
The Real Problem: Motion and Performance
Static bioluminescent water looks decent. Animated bioluminescent water is where things fall apart if you're not careful. Here's what happened to me on a recent project: I had the Noise Texture set to animate over time for a flowing effect, and I was also using the Voronoi for dynamic contact highlights. On Cycles, the render time jumped from about 4 minutes per frame to roughly 22 minutes. Eevee held at around 30fps in the viewport but started dropping to single digits once I added any kind of bloom post-process. My workaround was to bake the noise animation into a texture sequence first. I rendered a 120-frame preview at low resolution (512x512), saved it as an EXR sequence, and then referenced that baked texture in the actual shader. This cut Cycles render time back down to around 5 minutes per frame because the shader was no longer computing noise on the fly for every sample. For Eevee, I kept the live noise but disabled Bloom in the compositor and instead layered a separate glow pass in post using DaVinci Resolve. The visual result was nearly identical and I maintained a comfortable 24fps in the viewport. If you're doing real-time work in a game engine, this baked texture approach is even more critical. Mobile devices will choke on animated procedural noise in a fragment shader. Pre-bake it into an animated sprite sheet or texture array and you'll be fine.
Get the Full Details

Common Pitfalls and Why Your Bay Looks Fake
The biggest issue I see is that people make the glow too uniform. Natural bioluminescent bays like the one in Mosquito Bay in Puerto Rico or the ones in Vieques have patchy, irregular distributions. Some areas are intensely bright while adjacent water looks almost dark. Your noise textures need to create this kind of high-contrast variation. Use a ColorRamp node after your Noise Texture and push the black point up — this kills the midtones and gives you hard transitions between glowing and non-glowing regions. Another mistake is ignoring the depth of the effect. In real bioluminescent water, the glow exists at and just below the surface. It doesn't permeate the entire volume uniformly. If you're working in Cycles with a volumetric scatter setup, keep the scattering coefficient extremely low and concentrate your emission on a thin surface layer. A Volume Scatter node with a density of 0.01 or lower works. Anything higher and you're simulating a glowing fog bank, not bioluminescent water. A note on color accuracy: the most commonly cited bioluminescent organism in these bays is Pyrodinium bahamense, a dinoflagellate that emits a blue-green light around 490 nanometers. That's why the classic reference images are all cyan-teal. If you shift too far toward green or blue, it starts looking like something else — algae bloom, chemical spill, whatever. Stay close to that 490nm range for authenticity. I typically use a base color around #00b4d8 with emission weighted toward the green side at roughly a 60/40 split.
When This Approach Falls Short
This shader setup works well for static shots, short animations, and indie game assets. It breaks down if you need photorealistic large-scale environments with complex lighting interactions. The procedural noise approach can't simulate the actual subsurface scattering behavior of real bioluminescent plankton in moving water. If you're doing high-end architectural visualization or film work, you'd be better off using a custom volumetric shader with scanned plankton distribution data or a particle-based emission system. For quick prototype work or personal projects though, this node setup gets you 80% of the way there in under 20 minutes. Build it, tweak the Noise Texture scale and ColorRamp positions until the patchiness looks right, bake the animation if you need it, and you're done.