Settings

Theme

Cigarette smoke effect using shaders

garden.bradwoods.io

154 points by bradwoodsio a month ago · 26 comments

Reader

bhouston a month ago

Very cool!

I did similar cigarette/ink-like smoke a few times in the VFX industry.

The first attempt was similar to yours using a grid: https://benhouston3d.com/siggraph/2005-2.html, but like yours it isn't that scalable (lots of memory and slow, but maps to GPUs well.)

The second approach, used in the Exocortex Slipstream VX plugin series, was much more efficient using "vortex method" thus not tied to a grid:

Demo video: https://vimeo.com/groups/slipstreamvx/videos/11901355

Harry Potter usage: https://benhouston3d.com/exocortex-intel-article-va10mag.pdf

Theory video: https://vimeo.com/69586020

The second method, vortices, can be mapped to GPUs via complex memory structures though:

https://vimeo.com/11928506

talkingtab a month ago

There is the smoke part - worth seeing, the shader part - well worth exploring (shaders make you see the world in a different way , then there is the learning part. The site is very interactive so it allows you to see one, do one and maybe teach one.

Many people are stuck in html land. I was. Webgl, threejs, @react-three/{fiber/drei} provide another dimension and shaders are the gateway.

Very highly recommended as a skill worth understanding (at least).

petermcneeley a month ago

In a game this is likely done as simply a prerendered animated texture (atlas). Perhaps in a modern AAA game you might try a GPU particle system with 10k+ particles.

  • Lerc a month ago

    I suspect it depends more on what the developer knows. You certainly don't need to be AAA to do particle smoke, I've done webgames with particle smoke in JavaScript.

    With the right tech artist, this sort of shader is essentially what their job is. ShaderToy shows how much you can do with a quad and enthusiasm.

  • corysama a month ago

    Back in the days of the PS2, you’d just take a couple of long triangle strips, give them a twist or two, then UV-animate a static texture up through them.

  • embedding-shape a month ago

    Or, a shader :) Smaller size than a atlas, more efficient that full on particle simulation.

    • jayd16 a month ago

      Particle systems can be very efficient. Modern ones are designed to be able to build this kind of shader from a GUI. If you don't use any kind of physical simulation (and this doesn't), you wouldn't pay for it.

      You could build this same set up in a particle system and then have convenient knobs (like physics) to turn on for higher quality instances.

echoangle a month ago

Small mistake in the article: "Occlusion" is misspelled as "Occulsion" multiple times.

lelandfe a month ago

As someone who knows nothing about shaders, this was very cool. Pretty refreshing to see such an interesting site design, too.

  • orphea a month ago

      > an interesting site design
    
    Agree - making the scrollbar only 8 pixels wide is an interesting choice...
    • wvbdmp a month ago

      about:config

          layout.css.scrollbar-color.enabled – false
          layout.css.scrollbar-width-thin.disabled – true 
          layout.css.scrollbar-width.enabled – false
      
      fuckem
reactordev a month ago

awww, cool effect but I was half hoping for fluid dynamics simulation of the smoke with a lorenz fractal. What I've done is render the "smoke" to a framebuffer then apply some velocity to create some small vorticities.

  • fleahunter a month ago

    Interesting point about the fluid dynamics! I’ve always been fascinated by how we can use math and physics to create visuals that feel so alive. A couple years back, I tried to replicate smoke effects in a game and ended up getting lost in fluid simulations—it’s wild how a few equations can lead to such organic results.

    But I wonder if there's a way to combine both approaches? Like using smooth gradients for the base texture while applying some small-scale turbulent dynamics on top. It could add a nice touch of realism without going full-on simulation, which can get heavy on performance.

    Also, have you found any tools or libraries that make working with these simulations more accessible? Sometimes it feels like there’s a barrier to entry with the math, but once you get it, the creative possibilities are endless!

    • reactordev a month ago

      Vector textures is how you fake it like you’re talking about. Just render the fft/liquid to a 3D texture where the RGBf is the normalized vector. Use this texture when you render the smoke billboard to add those vortices in 3D space by multiplying the uv by the vector in the vertex shader and shading like you do with the noise in the pixel shader.

      Ooooo… we have smoke like it’s a 1930s billiards bar.

      Here’s a few examples that use some fluid dynamics to make “smoke”

      https://play.huwroberts.dev/advection/

      https://www.shadertoy.com/view/DsKyWm

      https://ghostinthecode.net/2016/08/17/fire.html

      For fire, the import part is the flame, not the spark. It’s the same methods as above. Everything eventually lands on a 2D texture where you blur or blend it with the scene.

      For smoke ribbons this works really well in screen space. For big plumes like mushroom clouds or physical clouds not so much. For those, volumetric SDF is the way to go with rayleigh marching and some gradient of grey.

      Anyway, happy coding and enjoy playing with the rules of reality!

DamnInteresting a month ago

I made a similar effect a few years back using layered transparent PNGs[1]. It's not quite as dynamic, but it's probably a lot more efficient.

[1] https://www.damninteresting.com/ghoulish-acts-dastardly-deed...

dylan604 a month ago

As a very young person using an acquired copy of Photoshop with very little knowledge of graphic design, the Filter > Render > Clouds was something that I would never have guessed at just how useful and how often I would actually end up using it after many many hours in the chair.

birdman3131 a month ago

A bit pedantic but that is a pipe smoke effect not a cigarette effect. Cigarette smoke tends to go horizontal for a ways before kinda going vertical.

It works well in the image they use to demo it but the image shows a pipe where it actually looks right.

  • embedding-shape a month ago

    I'm not sure you can say one behaves one way and the other not, surely depends on lots of variables.

    As an anecdote, I'm literally sitting with a lit cigarette in my hand right now, and the little smoke that comes from the cigarette itself, goes straight up.

    • llmslave2 a month ago

      > I'm literally sitting with a lit cigarette in my hand right now

      How does it feel to be living my dream rn...

pavlov a month ago

Immediately plays the Broadcasters logo laughter in my head.

IYKYK (but only if you lived in Finland in the 1990s)

throw-12-16 a month ago

i am so glad threejs is still seeing use, my personal favorite js lib

simonsarris a month ago

Beautiful, my favorite kind of post for HN. Thank you Brad.

ProllyInfamous a month ago

Attention aspiring landlords: please consider how expensive it is to remediate a property after years of indoor nicotine use (let alone the health effects to adjoining units, if any). Do whatever you want inside your own house, I don't care.

—Property manager, currently renovating a decades-smoked unit — just absolutely disgusting (and the de-tar chemicals are harsh, while still requiring mechanical dislodging) — I've already suggested that a non-refundible $3,000 deposit become required, if nicotine indoors isn't outright-banned (I don't care about weed indoors — it doesn't leave behind yellow tar everywhere).

So glad that even after decades of minimal drug abuse, cigarettes were never one of my vices.

lucasoshiro a month ago

Cool! But the title made me think that "cigarette smoke effect" made me think that it was about health issues, and I clicked because I was curious about how shaders could be related to that.

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection