Computer >> 컴퓨터 >  >> 프로그래밍 >> HTML

HTML 캔버스 애니메이션: 노이즈를 무한히 반복해 움직임 효과 구현하기

캔버스 노이즈 애니메이션이란?

HTML5 캔버스(Canvas)를 활용하면 무작위 노이즈 패턴을 지속적으로 갱신하여 TV 화면의 잡음 같은 역동적인 시각 효과를 만들 수 있습니다. 핵심은 putImageData() 메서드인데, 이 메서드는 픽셀 단위의 이미지 데이터를 캔버스 위에 직접 렌더링하는 역할을 합니다.

성능 저하 없이 부드러운 애니메이션을 구현하려면, 메인 루프 내부에서 매번 새로운 객체를 생성하는 대신 재사용 가능한 ImageData 객체를 루프 외부에 미리 만들어 두는 것이 중요합니다.

구현 코드 예제

var ct = c.getContext("2d", {alpha: false}); // 알파 채널이 없는 컨텍스트
var a = ct.createImageData(c.width, c.height);
var buffer = new Uint32Array(a.data.buffer); // 빠른 픽셀 조작을 위한 버퍼

function loop() {
    noise(ct);
    requestAnimationFrame(loop)
})()

function noise(ct) {
    var l = buffer.length - 1;
    while(l--) buffer[l] = Math.random() <0.5 ?0 : -1>>0;
    ct.putImageData(a, 0, 0);
}

코드 동작 원리 상세 설명

1. 컨텍스트 초기화

getContext("2d", {alpha: false}) 옵션을 사용하면 알파(투명도) 채널이 제거된 드로잉 컨텍스트를 얻을 수 있습니다. 불필요한 투명도 연산을 생략하기 때문에 렌더링 성능이 향상됩니다.

2. 재사용 가능한 이미지 데이터 생성

createImageData()로 캔버스 크기와 동일한 ImageData 객체를 한 번만 생성하고, Uint32Array 타입 배열로 데이터 버퍼를 감싸면 픽셀 하나당 32비트 단위로 빠르게 값을 대입할 수 있습니다.

3. requestAnimationFrame 기반 무한 루프

requestAnimationFrame(loop)는 브라우저의 화면 갱신 주기(보통 초당 60회)에 맞춰 noise() 함수를 계속 호출합니다. 이 방식은 setInterval보다 효율적이며, 탭이 백그라운드에 있을 때 자동으로 실행이 일시 중단되어 CPU 자원을 절약합니다.

4. 노이즈 픽셀 생성 로직

noise() 함수는 버퍼의 모든 픽셀을 순회하며 Math.random() 값이 0.5 미만이면 검정(0), 그렇지 않으면 흰색(-1 >> 0, 즉 32비트 정수상 최대값)을 할당합니다. 그런 다음 putImageData(a, 0, 0)로 완성된 노이즈 프레임을 캔버스 좌표 (0, 0) 위치에 출력합니다.

활용 및 응용 아이디어

이 기법은 단순한 화이트 노이즈 효과를 넘어 다양하게 확장할 수 있습니다. 예를 들어 회색조(grayscale) 노이즈로 부드러운 질감을 표현하거나, 특정 색상 채널(RGB)에만 무작위 값을 적용해 컬러 글리치 효과를 낼 수도 있습니다. 또한 프레임 간 갱신 빈도를 조절하면 오래된 필름의 그레인(grain) 질감처럼 은은한 배경 효과도 손쉽게 구현할 수 있습니다.