포스트

[ Dx11 ] (solution) 모션 블러가 원하는 위치에 생성 되지 않음

문제


아래 그림과 같이 여러 물체가 이동하는 씬에 모션 블러 적용 시, 모션 블러 효과가 이상하게 나오는 경우가 발생한다.

해결


모션 블러 효과는 자기 자신에게 오는 모션 벡터를 통해 시간 별 픽셀 이미지를 가져 온다. 이를 확인하기 위해 코드를 수정해서 이미지를 출력했다.


물체 간 서로 거리가 있을 경우, 아무런 이상 없이 평균 색상이 잘 출력되고, 그 다음 레이어에서도 문제가 없었다.

모션블러가 적용된 컬러맵의 첫번째  layer
모션블러가 적용된 컬러맵의 두번째  layer


그런데 물체 간 거리가 가까워지면, 물체 간 색상 침범 현상이 발생한다.

이러한 문제는 결국 색상 샘플 위치가 잘못되었을 가능성이 높으므로, 모션 벡터가 올바르게 색상을 샘플하는지 확인하였다.


찾아낸 문제점으로 자신에게 오는 모션 벡터 존재하는 픽셀의 경우, 색상을 적용했는데 아래와 같이 자신에게 오지 않는 모션 벡터도 저장하는 것을 확인할 수 있었다.

IsIntersect 할 때 자신에게 오지 않는 MotionVector도 저장


MotionVector ==0 일때 문제 발생


모션 벡터가 0일 때를 확인했을 때, 샘플 되는 픽셀의 수에서 큰 차이를 보였다.

MotionVector ==0 일때 break


MotionVector ==0 일때 break 하지 않을 때


모션 벡터가 0인 경우를 없애자, 자신에게 오는 모션벡터를 따라 색상을 샘플하게 되었다.


그러나 이는 적절한 모션 벡터 값이 아닌 강제로 0이 아니게 만든 것이므로, 자신에게 오는 모션 벡터 탐색 알고리즘을 바꿔야 한다.


따라서 선분 교차 알고리즘을 적용, 적절한 선이 그려지는지를 확인했다.

위 알고리즘을 통해 선을 그렸을 때, 적절한 선이 그려진 것을 확인할 수 있었다.


그리고, 기존 알고리즘을 적용하였을 때, 아래와 같은 결과를 보였는데, 이는 기존 알고리즘이 스크린 공간으로 치환하여 좌표 값을 계산하여 발생한 것으로 보인다.


따라서, 선분 교차 알고리즘을 적용하여 올바른 모션 블러 효과가 적용된 이미지를 출력할 수 있었다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.