포스트

[ Dx11 ] (solution) 모션 블러의 일부 픽셀 소실

문제


앞서, 자신에게 오는 모션 벡터를 잘못 찾아 물체 간 색상이 침범하는 현상을 해결하였으나, 또 다른 문제가 발생했다.


이러한 형태로 앞에 위치한 물체의 모양으로 뒤에 있는 물체에 일부 픽셀이 소실되는 현상이 발생했다.

모션벡터 반대방향 공의 일부 픽셀이 소실되는 현상
자신을 지나는 모션벡터맵의 첫번째 layer


이러한 현상은 자신에게 오지 않는 모션 벡터를 저장할 때는 발생하지 않았다.

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


그래서 이를 교차 확인 알고리즘에서 발생한 것인지 확인했으나, 모션 벡터는 올바르게 출력된 것을 확인할 수 있었다.

intersectedMotionVector[LAYERSCOUNT][intersectingCount]


이러한 문제가 단순하게 샘플 횟수가 모자라서 발생한 것은 아닌지 확인했으나, 샘플 횟수를 늘려도 똑같은 현상이 발생했다.

RANDOMPICKCOUNT 48 -> 120

해결


이러한 문제는 샘플 횟수가 증가함에 따라 두드러졌고,


교차 검사의 시작 픽셀 위치를 조정하면서 조금 나아졌지만, 여전히 일부 픽셀에서 소실현상이 발생하였다.


이는 샘플 횟수를 늘리면 해결되나, 샘플 횟수가 늘어날수록 성능이 확연히 떨어지기 때문에, 이를 해결할 수 있는 방법을 고안했다.


자신에게 오는 모션 벡터를 따라 색상을 샘플 시 주변 다른 물체가 존재하는 경우 자신에게 오지 않는 모션 벡터가 존재하여 색상 샘플에 실패할 확률이 높아진다. 그리고 샘플 횟수가 적음에 따라 샘플이 완전히 실패하여 원하는 색상을 샘플하지 못하게 되는 경우가 발생하기 쉬워져 위와 같은 현상이 발생한다.


따라서 이를 해결하기 위해 실패 위치 샘플을 다음 레이어에서 다시 시도한다. 단순하게 샘플 횟수를 늘리는 것이 아닌 다음 레이어의 실패 위치에서의 다시 색상을 샘플한다. 다만 색상을 다른 레이어에서 가져오는 경우, 다른 레이어에서 다른 물체가 존재할 때, 해당 레이어에서는 존재하지 않는 색상을 가져오므로, 해당 레이어에서 해당 레이어의 색상을 가져와 샘플한다.

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