- 모션 블러를 “논리적 극한”까지 밀어붙이는 이 실험은 인간 시각의 motion smear와 화면 재생의 차이를 줄이는 방식으로 흐림을 다시 정의하고, 이를 절차적 실시간 애니메이션에 적용함
- 자연 장면에서는 망막 원추세포가 빛 자극을 시간적으로 통합해 수용체 단계의 흐림이 생기지만, 낮은 프레임레이트 화면에서는 블러 없는 영상이 자연스러운 smear 대신 겹친 프레임처럼 보임
- 전통적 모션 블러는 한 프레임의 시간 구간을 평균내 자연 장면에 가까워지지만, 빠른 물체에서는 불연속이 남을 수 있어 시작과 끝의 가중치를 낮추는 셔터 함수(shutter function) 가 더 자연스러운 결과를 만듦
- 실시간 셰이더 구현은 멀티샘플링과 해석적 레이트레이싱을 피하고, 움직이는 물체를 시간 포함 좌표의 밀도 함수로 표현한 뒤 시간 적분값을 볼륨 레이 캐스팅으로 렌더링함
- 최종 “Torusphere Accelerator”는 궤도 운동하는 구와 회전하는 토러스를 사실상 무한 속도까지 블러 처리하며, “모션 블러된 법선”이 없기 때문에 표면 법선은 별도 보간으로 다룸
자연 장면의 움직임과 화면 재생의 차이
- 모션 블러는 원래 카메라 셔터가 열려 있는 동안 피사체가 움직여 생긴 필름 아티팩트였지만, 영상이 자연 장면과 지각적으로 더 비슷해지는 효과 때문에 유용해짐
- 3D와 애니메이션에서는 “카메라를 시뮬레이션하는 것”과 “자연스럽게 보이는 것”이 항상 같은 목표가 아닐 수 있음
- 자연스러운 모션 블러를 보려면 네 가지 질문이 필요함
- 자연 장면의 움직임을 어떻게 지각하는가
- 화면에 재생된 장면을 어떻게 지각하는가
- 두 경우의 지각 차이는 무엇인가
- 비디오 모션 블러가 그 차이를 어떻게 줄일 수 있는가
원추세포의 시간 통합과 motion smear
- 밝은 환경에서 인간 시각의 초기 처리는 원추세포가 담당하며, 광변환(phototransduction) 은 즉시 일어나지 않음
- 빛 자극의 지연은 시간 방향으로 자극을 부드럽게 만드는 방식으로 모델링할 수 있음
- Howlett et al. (2017)의 금붕어 원추세포 예시는 광수용체로 들어오는 광자 수, 가중 함수, 그 결과인 “effective stimulus”를 보여줌
- 이 가중 함수 형태와 알려진 인간 원추세포 반응 시간을 결합하면 입력 장면에서 지각된 이미지를 시뮬레이션할 수 있음
- 그 결과 자연 장면에서도 광수용체 수준의 자연스러운 흐림인 motion smear가 이미 존재함
- 예시 시뮬레이션은 관찰자가 물체를 눈으로 추적하지 않고 고정된 지점을 보고 있다고 가정함
화면 영상에서 전통적 모션 블러가 하는 일
- 제한된 초당 프레임 수의 화면을 볼 때, 모션 블러가 없는 영상의 지각 이미지는 기대되는 motion smear가 아니라 겹쳐진 프레임처럼 보임
- 모션 블러가 적용된 영상은 각 프레임이 한 순간을 보여주는 대신, 프레임이 덮는 시간 구간의 모든 순간을 평균냄
- 이는 한 프레임 시간 동안 셔터가 열려 있는 카메라로 만든 영상과 유사함
- 이 방식의 지각 이미지는 자연 장면의 경우와 훨씬 더 비슷해짐
셔터 함수로 불연속 줄이기
- 전통적 모션 블러에서도 일부 물체 속도에서는 motion smear에 불연속 아티팩트가 남을 수 있음
- 셔터 함수는 프레임 구간 전체를 균등 평균하지 않고, 프레임의 시작과 끝 순간에 낮은 가중치를 주고 중앙 순간에 더 높은 가중치를 줌
- 이름은 다이어프램 카메라의 셔터 효율 비유에서 왔지만, 여기서는 카메라 시뮬레이션보다 화면과 자연 장면의 지각 차이를 줄이는 함수 선택이 목적임
- 이 문제는 신호 처리의 윈도 함수(window function) 를 만드는 문제와 매우 비슷하며, 인기 있는 윈도 함수들이 좋은 결과를 냄
- 주관적 테스트 기준으로는 물체가 한 프레임 동안 이동하는 거리가 물체 폭과 같은 규모가 될 때 셔터 함수가 유용해짐
- 낮은 속도에서는 필요성이 크지 않지만, 빠르게 움직이는 물체에서는 더 자연스럽고 정지 프레임도 더 부드럽게 보임
- 이 접근은 통상적인 카메라 시뮬레이션 방식이 아니며, 연속 프레임의 시간 범위가 서로 겹칠 수 있음
- 일반적인 카메라 시뮬레이션은 프레임 간 시간 겹침이 없고, 프레임 사이의 순간을 버리는 경우가 많음
실시간 셰이더로 “무한 모션 블러” 만들기
- 목표 애니메이션은 궤도 운동하는 구와 회전하는 토러스를 결합하고, 둘 모두를 사실상 무한 속도까지 모션 블러 처리함
- 최종 결과물을 상호작용 가능하게 만들기 위해 실시간 shader로 구현함
- 멀티샘플링은 각 프레임마다 여러 시간 지점의 장면을 렌더링하는 방식임
- 물체 속도가 높을수록 필요한 샘플 수가 비례해서 늘어남
- “무한 속도” 애니메이션에는 맞지 않음
- 해석적 레이트레이싱 모션 블러도 대안이 될 수 있음
- 메시에서는 삼각형을 프리즘으로 바꾸는 방식이 있음
- 순수 해석적 접근도 가능하지만, 여기서는 더 무거운 방식이 될 수 있음
- 두 방식 모두 재질 처리를 위해서는 여전히 멀티샘플링이 필요함
- 선택한 구현은 “integrated volume motion blur”라고 부를 수 있는 해킹에 가까운 방식임
- 움직이는 물체를 시간까지 포함한 좌표를 입력받아 내부는 1, 나머지는 0의 밀도를 반환하는 함수로 표현함
- 이 밀도 함수를 시간에 대해 적분하면 임의 시간 구간의 모션 블러된 밀도를 얻음
- 결과는 volume ray casting으로 렌더링함
- 사진처럼 정확한 방식은 아니지만, 매우 긴 궤적을 실시간 성능으로 다룰 수 있음
궤도 운동하는 구의 모션 블러 밀도
- 궤도 운동하는 구는 2D 단면에서 궤도 운동하는 원의 문제로 줄일 수 있음
- 원의 중심은 원점에서 거리 R에 있고, 원의 반지름은 a라고 둠
- 극좌표에서 주어진 반지름 r에 대해 물체 표면의 각도 θ를 구하면, 점이 물체 안으로 들어오는 시점과 나가는 시점을 계산할 수 있음
- 물체가 속도 v로 궤도 운동하면 각도 좌표에서 시간 항 vt를 빼는 형태로 표현됨
- 어떤 공간 점에서 물체가 존재하는 시간 구간 I와 현재 프레임 시간 구간 F의 교집합 길이가 모션 블러된 밀도가 됨
- 셔터 함수 s를 적용하면 밀도와 s(t)를 곱해 적분하며, s의 부정적분 S가 있으면
S(max I) - S(min I)형태로 계산할 수 있음 - 애니메이션에 사용한 사인 기반 셔터 함수는 적분값이 1이고, 시간축에서 겹쳐도 임의 시점의 합이 항상 1이 되도록 설계됨
회전하는 토러스와 spiric section
- 회전하는 토러스도 구와 같은 절차로 처리함
- 토러스의 2D 수직 단면은 spiric section, 또는 Spiric of Perseus라고 불림
- 토러스의 minor radius를 a, major radius를 b로 두고 특정 위치 c의 단면을 잡으면 극좌표 식으로 토러스 내부 영역을 표현할 수 있음
- 표면 각도 θ를 풀어 양수와 음수 두 경우를 얻고, 두 경계 사이를 solid torus의 밀도로 사용함
- 이후 단계는 궤도 운동하는 구와 동일하게 시간 구간을 구하고 셔터 함수 적분을 적용함
최종 Torusphere Accelerator
- 최종 장면은 구와 토러스를 결합하고 표준 볼륨 레이 캐스팅으로 렌더링함
- Surface normals는 추가 처리가 필요함
- “모션 블러된 표면 법선”이라는 개념이 없기 때문에 구현에서는 법선을 섞어 사용함
- 라이브 애니메이션은 기본 마우스와 터치 상호작용을 지원함
- 모든 기기에서 잘 동작하지 않을 수 있어 페이지 상단에 미리 렌더링한 영상도 제공함
- 최종 셰이더는 Shadertoy에서도 볼 수 있음
HN 논의에서 이어진 쟁점
- Hacker News 논의에서는 모션 블러 품질을 예술적 선택으로 보는 시각이 나옴
- 색공간 변환의 중요성도 함께 이야기됨
- 영화 VFX에서 모션 블러가 역사적으로 어떻게 발전했는지도 논의됨
- 초기 CG 영화인 Jurassic Park는 물리적으로 불가능한 box shutter function을 사용한 사례로 거론됨
- 게임에서의 모션 블러는 여전히 논쟁적인 주제로 남아 있음