UDN
Search public documentation:

MotionBlurKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 포스트 프로세스 이펙트 > 모션블러 포스트 프로세스 이펙트
UE3 홈 > 시네마틱 아티스트 > 모션블러 포스트 프로세스 이펙트

모션블러 포스트 프로세스 이펙트


왼쪽: 모션 블러 끈 상태
오른쪽: 모션 블러 켠 상태(로 카메라 빠르게 이동)

문서 변경내역: 2010/6/7 Martin Mittring 작성; 홍성진 번역.

개요


모션 블러란 가만히 있는 이미지나 무비에서 볼 수 있는 효과입니다. 카메라에서 필름에 빛을 노출시킬 때 일정 기간 셔터를 열어두기도 합니다. 그때문에 빠르게 움직이는 물체에서는 잔영, 블러 효과가 나게 됩니다. 인간의 눈에 모션 블러가 인지되는 이유는 눈의 신경에도 일정 기간에 걸친 반응(, 즉 시간에 따라 이미지가 희미해 지는 현상)이 있기 때문입니다. 모션 블러는 보통 영화같은 프레임율(20~30)이나 스크린샷에서 볼 수 있습니다.

구현된 모션 블러 기법은 카메라 모션 블러오브젝트 모션 블러 기능입니다. 오브젝트 모션에 대해서는 각 화면 픽셀마다 2d 속도 벡터를 생성했습니다. 이 정보가 매 프레임마다 업데이트되어 중간 속도 텍스처에 저장됩니다. 잇따르는 반해상도 포스트 프로세스에서 이 정보를 사용하여 반해상도 모션 블러링된 이미지를 생성합니다. 이걸 전해상도 씬 이미지와 섞어서, 고해상도 이미지는 필요한 곳에는 그대로 쓸 수 있도록 유지시킵니다. 모션 블러링된 이미지는 약간의 텍스처 룩업을 평균내서 생성합니다. (텍스처 룩업 5번을 평균내면 고스트 이미지도 5개 나타날 수 있으니) 다수의 이미지가 겹쳐 보이는 것을 피하기 위해 최대 화면 속도를 제한합니다. 반해상도 모션 블러는 성능에도 도움이 될 뿐만 아니라 텍스처 룩업도 줄어드니 일석이조가 아니겠습니까?

심화 기술적인 글: Motion Blur Skinning KR Motion Blur Soft Edge KR

구현


두 종류의 모션 블러를 적절히 혼합해 주면 (카메라가 이동하는 오브젝트를 비슷한 속도로 따라갈 때처럼) 이동 방향이 같을 때는 모션 블러 효과가 감소되는 것을 볼 수도 있습니다. 이 방법은 씬 이미지가 있어야만 작업할 수 있기에, 모든 효과를 재현할 수는 없습니다. 모션 블러는 보통 알아채기가 매우 힘들기에 근사치를 엄청 늘려도 괜찮습니다. 그래야 사용할 만한 효과가 나기 때문입니다.

더 나은 성능을 위해서 위버 포스트 프로세싱 패스 이전의 프리 패스에서 절반해상도의 모션 블러링된 이미지를 만들었습니다. 결과 이미지의 스케일을 올려야 한다는 뜻이기도, 모션 블러링되지 않는(이동이 매우 작은) 이미지를 적절히 마스킹해 줘야 한다는 뜻이기도 합니다.

motionmblurtransiation.jpg
앞으로 움직이는 플레이어는 이미지 구석쯤에나 모션 블러를 볼 수 있습니다.
전해상도 이미지 부분과 반해상도 모션 블러 이미지 부분이 부드럽게 혼합되는 것을 볼 수 있습니다.

디버깅할 때는 "visualizetexture" 명령을 내리고 블렌드 마스크를 보면 됩니다. 전해상도인 곳은 알파 채널이 하얀 반면 블러링된 콘텐츠를 포함한 반해상도 버퍼는:

motionblurmask.jpg

플레이어 뷰를 회전시킬 때의 모션 블러를 보십시오. 예상된 바지만, 플레이어가 보고 있을 부분은 아닐 것입니다. 보통 눈의 초점은 이미지의 관심있는 부분에 맞춰지며, 그걸 계속 따라갑니다. 눈에 대해서는 모션 블러가 사라질 것입니다. 이런 효과를 흉내내기 위해 적절한 눈 추적 또는 눈 동작 시뮬레이션을 수행해야 할 (테지만 대부분 실패할) 것입니다. 대안으로는: 대부분의 화면 외곽 지역에만 영향을 끼치기 위해, 중요한 게임플레이의 경우 모션 블러를 제한하기 위해, 프레임율을 높이기 위해 모션 블러를 줄이고, 마스킹해 버리는 겁니다.

카메라 모션 블러 에 대해서는 이전 뷰 매트릭스, 현재 뷰 매트릭스, 픽셀 심도를 통해서 2D 모션 벡터를 바로 계산해 버릴 수 있습니다. 오브젝트 모션 블러 에 대해서는 모션 블러링된 오브젝트 (중에서 작거나 천천히 움직이는 것들은 성능상의 이유로 빼버리고, 그 외) 지오메트리 전부를 속도 텍스처라는 것 속에다가 렌더링하여 픽셀별로 벡터를 계산합니다. 이 텍스처 안의 데이터는 VisualizeTexture 콘솔 명령을 사용하면 볼 수 있습니다:

perobjectmotionblur.jpg
왼쪽: 게임에서 회전하는 모습.
오른쪽: 같은 씬을 VisualizeTexture 콘솔 명령을 내리고 본 모습.

속도 텍스처의 색은 모션 벡터 방향과 세기를 나타냅니다. 다음 이미지는 모션 벡터를 정의하는 데 빨강 및 녹색 채널이 어떻게 사용되는 지를 나타냅니다. (원은 최대 속도를 나타냅니다):

colormeaning.jpg
속도 텍스처의 색은 오브젝트 모션을 나타냅니다.
곰정은 카메라/노 오브젝트 모션용입니다.
파랑과 알파 채널은 래디얼 블러 기능에 의해 사용될 수도 있습니다.

리짓 바디 에 대한 옮기기, 회전, 스케일 같은 매트릭스 변형이 전부 지원됩니다. 이런 기법은 특정한 하드웨어 기능을 필요로 하기에 성능 문제가 있을수 있어 디폴트로 켜 두지는 않았습니다. 자세한 내용은: Motion Blur Skinning KR

PerBoneMotionBlur.jpg
모션 블러 스키닝을 통해 각기 다른 방향으로 움직이는 바디 부분도 처리가 가능합니다.

방향성 블러링


이상적으로는 이동 방향으로 이미지 콘텐츠를 픽셀 단위로 분산시킵니다. 그걸 순진하게 그대로 구현해 버리면 엄청 느리겠죠. 현재 근사치 작업으로는 복수의 바이리니어 필터링 텍스처 룩업 기반 개더(gather, 그러모으기) 연산으로 합니다. 씬 텍스처의 반해상도 버전을 사용해 보니 성능도 괜찮고 모션까지도 부드럽게 나옵니다. 복잡한 모션의 경우 벡터가 꽤나 클 수 있습니다. 효과에 이미지가 여럿 겹치는 걸 방지하기 위해서 모션을 2D 원반형으로 고정할 수 있습니다. (Max Velocity 참고)

HDR 이미지를 입력으로 두고 모션 블러 이후에 톤 매핑을 하니 이미지의 밝은 부분은 선이 선명하게 보이는 것을 볼 수 있습니다. 실제 카메라에서도 그러하니 바람직한 현상입니다.

HDRMotionBlur.jpg
밝은 오브젝트(HDR 콘텐츠)는 모션 블러 덕에 더 밝아 보입니다.

gather 연산은 빠르고 모션 방향으로 이미지 내용물을 블러링해 주기는 하지만, 좀 더 신경써 주지 않으면 이미지 내용물이 (3인칭 플레이어처럼) 이동하는 오브젝트 앞에 가만히 있는 구역으로 샐 수가 있습니다. 이 문제를 고치기 위해 그런 곳은 마스크 처리하고 움직이는 오브젝트 안에만 블러링 처리합니다. 이것만으로는 충분하지 않은데, 경계 안쪽으로는 흐릿한 것이 그 밖으로는 깨끗해 보이기 때문입니다. 이런 문제는 모션 블러 소프트 에지 기능을 통해 해결할 수 있습니다.

MotionBlurSoftEdgeNumbers2.jpg
소프트 에지 기능을 통해 움직이는 오브젝트 밖에도 모션 블러 효과가 보이게 할 수 있습니다.

모션 블러 효과는 (포토샵에서 메써드 줌을 사용할 때의 래디얼 블러와 유사한) 래디얼 블러 기능과 결합되었습니다. 두 효과에는 공통점이 많기에 결합된 메써드도 효과적이었습니다. 두 메써드가 모션 벡터 하나를 공유하기에, 두 효과를 극단적으로 사용하면 글리치(순간적 이상)가 보일 수도 있습니다. 운만 따른다면야 그런 경우는 매우 드물 수 있습니다.

RadialBlur.jpg

파라미터 조정


포스트 프로세싱 체인의 위버 포스트 프로세싱 노드에서 다음 속성을 찾을 수 있습니다 (모션 블러 노드를 사용할 필요는 없습니다. 어차피 모션 블러 용으로는 위버 포스트 프로세스 노드가 필수고, 세팅도 똑같이 불러 오기 때문입니다):

editorsettings.jpg

Max Velocity (최대 속도)는 원반 내의 모션을 지정된 (화면 폭에 따라 조절되며, 높이와 상관 없이 항상 원형인) 크기로 제한합니다. 이 값은 적정 크기의 내부 상수 일부에 대한 곱수입니다. 1 아래의 수는 벡터를 더욱 심하게 제한하며, 1 위의 수는 블러를 더욱 강조시킵니다만 샘플 수는 동일하게 유지하기에 결과가 (여러 이미지로 나오는 등) 좋지 않습니다.

motionclamp.jpg

Motion Blur Amount (모션 블러 양)은 모션 블러 벡터에 대한 스케일입니다. 이 값을 먼저 조정하고서 Max Velocity는 높게 고정시켜 두지 않으면 스케일 변화를 볼 수 조차 없을 것입니다. 엄청난 양이 조그만 반경에 고정되고 마는 것이지요. 그래서 작은 모션도 블러링되기에 전체적인 효과는 모션 블러를 끈 것만 못하게 나올 것입니다.

motionscale.jpg

Full Motion Blur (풀 모션 블러) 체크박스를 통해 카메라 모션 블러를 끌 수 있습니다. 오브젝트 모션 블러만 남습니다.

Camera Rotation Threshold (카메라 회전 한계점)은 카메라 모션 블러가 유지 가능한 카메라의 최대 회전 각도입니다. (카메라 컷에 좋습니다.)

Camera Translation Threshold (카메라 옮기기 한계점)은 카메라 모션 블러가 유지 가능한 카메라까지의 최대 거리입니다. (역시나 카메라 컷에 좋습니다.)

포스트 프로세싱 볼륨이 체인 내 세팅을 덮어쓰게 됨에 유의하십시오.

액터에서 Motion Blur Scale (모션 블러 스케일)을 찾을 수 있습니다. 이 값은 한 때 카메라( 플랫폼 등)와 함께 움직이는 오브젝트의 모션 블러를 끌 때 필요했습니다. 이제 모션 블러가 그런 상대성 이동을 제대로 처리하니 필요 없어 졌습니다. 곧 사라질 테지만, 새로운 구현에 뭘 빼먹은게 있거나 하면 다시 들여놓을지도 모르겠습니다.

모션 블러와의 상호작용


현실 세계의 블룸은 같은 방향으로부터 (화면상의 위치로부터) 많은 양의 빛이 들어올 때 관찰됩니다. 모션 블러는 밝은 영역의 양을 더 큰 화면 영역으로 퍼뜨릴 수 있습니다. 최근(2010/10/28) 변경사항에서 이런 효과를 흉내낼 수 있습니다.

BloomAfterMotionBlur.jpg
새로운 방법을 통해 블룸이 오브젝트 이동 경로를 따라 좀 더 어둡게 퍼진 것을 볼 수 있습니다.

오브젝트나 카메라를 빠르게 움직이고, 세팅만 제대로(높은 최대 속도, 많은 모션 블러 양, 블룸 한계점 대 오브젝트 밝기 모션 블러 소프트 에지 등이) 되어 있으면 이펙트를 확인할 수 있습니다. 그러고 나면 예전에 블루밍된 밝은 부분은 좀 더 퍼지게 되며, 모션 블러를 좀 누그러 뜨릴 수도 있습니다.

알려진 제한사항 및 문제


  • 마티네 등에서 수행하는 카메라 컷이 모션 블러에는 문제가 있습니다. 현재 큰 카메라 회전 및 옮기기에는 모션 블러를 끄게 하고 있습니다. 두 값에 대한 한계점을 커스텀화해서 사용할 수 있습니다. 이상적으로 마티네는 이벤트를 만들 테니 유저 에러에 대한 걱정은 한 줌 덜 수 있습니다. 근데 그걸 고쳐도 (게임 코드 같은데) 남는 게 있을 것입니다. 이상적으로 항상 카메라를 움직이고는 점프를 해야지, 안그러면 카메라 스위치가 달리 처리됩니다. 카메라 오브젝트는 (뷰당) 매 프레임마다 재생성되고 있기에 구현하기가 좀 까다롭습니다.
  • 높디 높은 Max Velocity 값은 이미지가 여러개로 나타납니다. (픽셀단위 랜덤화를 시도해 봤지만, 결과는 좋지 않았습니다. 성능을 댓가로 샘플을 늘리면 도움이 될테니, 그런 옵션을 추가해야 겠습니다.)
  • 모션 블러는 반해상도 씬 입력을 기반으로 하며, 위버 포스트 프로세싱 패스에서 언샘플링되는 반해상도 텍스처로 렌더링됩니다. 보일 수도 있는거죠. (노출 전에) 마스킹을 만져주면 도움이 좀 될 것입니다.
  • 편집감 향상을 위해 에디터에서는 모션 블러를 껐습니다. 레디얼 블러에도 영향을 끼칩니다.

쓸만한 콘솔 명령


show postprocess
(포스트프로세스 표시) 포스트프로세싱을 모두 켜거나/끕니다.
VisualizeTexture
(텍스처 시각화) 중간 버퍼를 살펴봅니다. (예로 반해상도 모션 블러 입력, 속도 텍스처나 모션 블러 출력 등)
MotionBlurMaxVelocity
(모션 블러 최대 속도) 포스트 프로세스 세팅을 (트윅 및 디버깅 용으로) 덮어쓰기 위함입니다.
MotionBlurAmount
(모션 블러 양) 포스트 프로세스 세팅을 (트윅 및 디버깅 용으로) 덮어쓰기 위함입니다.
MotionBlurSoftEdge
(모션 블러 소프트에지) Motion Blur Soft Edge KR
MotionBlurSkinning
(모션 블러 스키닝) Motion Blur Skinning KR
set skeletalmeshcomponent bforcerefpose 1
(설정 스켈레탈메시컴포넌트 참조포즈강제여부 1) 애니메이팅되는 오브젝트의 스키닝을 끕니다.
slomo 0.1
(슬로모션 0.1) 월드 시뮬레이션을 느리게 (만들며, 기본값 1은 원래 속도로) 만듭니다.