SVG 난기류 변위

SVG turbulence displacement

feTurbulence 로 만든 노이즈를 feDisplacementMap 이 픽셀을 밀어내는 지도로 써서, 이미지 파일 없이 물결·일렁임을 만드는 SVG 필터 조합.

다른 이름: feTurbulencefeDisplacementMapWater ripple filter
···
html
<svg width="0" height="0"><filter id="ripple" x="-30%" y="-30%" width="160%" height="160%">
  <feTurbulence id="turb" type="fractalNoise" baseFrequency="0.02 0.04" numOctaves="2" seed="3" result="n"/>
  <feDisplacementMap id="disp" in="SourceGraphic" in2="n" scale="18" xChannelSelector="R" yChannelSelector="G"/>
</filter></svg>
<div class="pool"><h1 class="wave" id="txt">WAVE</h1></div>
<div class="label" id="l">scale: 18</div>
css
.pool{position:absolute;inset:0;display:grid;place-items:center;background:linear-gradient(180deg,#0ea5e9,#075985)}
.wave{position:relative;color:#fff;font:800 15vmin/1 sans-serif;letter-spacing:.02em;filter:url(#ripple);margin:0}
.label{position:absolute;left:10px;bottom:10px;padding:4px 10px;border-radius:999px;background:rgba(0,0,0,.55);color:#fff;font:600 12px/1.4 monospace}
js
const disp = document.getElementById('disp');
const turb = document.getElementById('turb');
const l = document.getElementById('l');
let t = 0;
function loop(){
  t += 0.02;
  const scale = 14 + Math.sin(t) * 10;
  disp.setAttribute('scale', scale.toFixed(1));
  const bf = 0.018 + Math.sin(t * 0.6) * 0.006;
  turb.setAttribute('baseFrequency', bf.toFixed(4) + ' ' + (bf * 1.8).toFixed(4));
  l.textContent = 'scale: ' + scale.toFixed(0);
  requestAnimationFrame(loop);
}
loop();

feTurbulence 는 펄린 노이즈 비슷한 무작위 패턴을 그리는 필터 프리미티브입니다. 그 자체로는 알록달록한 정적처럼 보이지만, feDisplacementMap 에 in2 로 물려주면 "이 노이즈의 R·G 채널 값만큼 원본 픽셀을 x·y로 밀어내라"는 지도가 됩니다 — 결과물은 원본이 노이즈의 굴곡을 따라 일렁이는 모습입니다.

baseFrequency 는 노이즈의 촘촘함(값이 작을수록 크고 부드러운 물결, 클수록 잘게 흔들리는 지글거림)을, feDisplacementMap 의 scale 은 얼마나 세게 밀어낼지를 정합니다. 이 데모는 두 값을 매 프레임 사인파로 흔들어서 물속에 잠긴 것 같은 지속적인 일렁임을 만듭니다.

주의점은 비용입니다 — 노이즈 생성과 변위 계산이 매 프레임 전체 필터 영역에서 다시 일어나므로, 넓은 영역이나 페이지 전체에 걸면 눈에 띄게 무거워집니다. 텍스트나 로고 같은 작은 요소에 한정해서 쓰는 게 안전합니다.

언제 쓰나

텍스트 하나·로고 하나처럼 좁은 영역의 "물속·아지랑이" 느낌에 씁니다. numOctaves 는 2 정도로 낮게 유지해서 비용을 줄이세요.