URP는 모션 벡터 렌더 패스를 사용하여 표면 프래그먼트의 프레임 간 스크린 공간 이동을 계산합니다. URP는 이동 데이터를 전체 화면 텍스처에 저장하며 저장된 픽셀당 값을 모션 벡터라고 부릅니다.
Unity는 프레임에 모션 벡터 렌더 패스를 요청하는 렌더 패스가 있는 활성 기능이 있을 때만 모션 벡터 렌더 패스를 실행합니다. 예를 들어 TAA(Temporal Anti-Aliasing)과 모션 블러 URP 기능은 모션 벡터 패스를 요청합니다. 커스텀 패스에서 모션 벡터 패스를 요청하는 자세한 방법은 패스에서 모션 벡터 텍스처 사용 섹션을 참조하십시오.
모션 벡터가 잘못되거나 누락되면 그에 의존하는 효과에서 시각적 결함이 발생할 수 있습니다. 이 페이지의 지침에 따라 오브젝트 렌더러, 머티리얼, 셰이더가 모션 벡터를 지원하도록 올바르게 설정되었는지 확인합니다.
URP는 알파 클리핑된 머티리얼을 비롯한 불투명 머티리얼에 대해서만 모션 벡터를 지원합니다. URP는 투명 머티리얼에 대한 모션 벡터를 지원하지 않습니다.
이 섹션에서는 URP가 모션 벡터를 구현하는 방법을 설명합니다.
모션 벡터란 마지막 프레임 이후 카메라를 기준으로 표면 프래그먼트의 모션을 나타내는 2D 벡터로, 카메라의 근거리 클리핑 평면에 투영됩니다. 모션 벡터 텍스처는 2개의 채널(R과 G)을 사용합니다. 각 텍셀은 각 가시 표면 프래그먼트의 UV 오프셋을 저장합니다. 주어진 텍셀의 현재 UV 좌표에서 모션 벡터를 빼면 해당 텍셀이 화면의 마지막 프레임에 있었던 위치의 UV 좌표를 얻을 수 있습니다. 계산된 마지막 프레임 UV 좌표는 화면 경계 밖에 있을 수 있습니다.
모션 벡터는 아래의 두 가지 범주로 나뉩니다.
카메라 모션 벡터: 카메라의 자체 모션에 따른 모션 벡터입니다.
오브젝트 모션 벡터: 카메라의 모션과 프레그먼트가 속한 오브젝트의 월드 공간 모션의 조합에 따른 모션 벡터입니다.
모션 벡터 텍스처만 주어진다면 화면에서 프레그먼트의 모션이 카메라 모션 때문인지, 오브젝트 모션 때문인지, 아니면 둘의 조합 때문인지 유추할 수 없습니다.
하나의 전체 화면만으로도 카메라 모션 벡터를 계산할 수 있습니다. 이러한 패스에는 씬의 복잡도와는 상관없이 고정된 프레임당 계산 부하가 있습니다. 알아야 하는 것은 화면에 있는 모든 픽셀의 현재 3D 위치와 카메라의 움직임 뿐인데, 이는 뎁스 버퍼와 현재 및 이전 프레임의 카메라 매트릭스를 통해 유추할 수 있습니다.
오브젝트 모션 벡터의 계산 부하는 씬에서 움직이는 오브젝트의 수와 복잡성에 따라 계산 부하가 달라지는데, 이는 각 오브젝트의 모션을 고려하기 위해 오브젝트별 드로우가 필요하기 때문입니다. 각 드로우는 카메라의 모션 기여도 또한 적용해야 합니다.
Unity는 다음 세 가지 조건이 충족된 경우 프레임에서 메시에 대한 오브젝트 모션 벡터를 렌더링합니다.
메시에 연결된 셰이더의 활성 서브셰이더 블록에는 MotionVectors 패스가 있습니다.
메시는 다음 렌더러 중 하나를 통해 렌더링됩니다.
SkinnedMeshRenderer
Motion Vectors 프로퍼티가 Camera Motion Only로 설정되지 않은 MeshRenderer
API 사용: Graphics.RenderMesh, Graphics.RenderMeshInstanced, Graphics.RenderMeshIndirect 중 하나(RenderParams 구조체의 MotionVectorMode 멤버가 Camera로 설정되지 않음)
다음 조건 중 하나가 충족되는 경우:
MotionVectorGenerationMode 프로퍼티가 MeshRenderer 또는 Grphics.Render... API의 RenderParams.MotionVectorMode 구조체 멤버에서 ForceNoMotion으로 설정됨
참고: ForceNoMotion 옵션을 사용하려면 매 프레임마다 오브젝트별 모션 벡터 패스를 렌더링하여 해당 오브젝트의 카메라 모션 벡터를 0으로 덮어쓸 수 있게 해야 합니다.
MotionVectors 패스는 머티리얼에서 활성화된 경우(예를 들어 머티리얼의 Shader Graph 또는 Alembic 애니메이션에 버텍스 애니메이션이 있는 경우).
MotionVectors 패스는 머티리얼에서 비활성화되어 있지만 이전 프레임과 현재 프레임의 모델 매트릭스가 일치하지 않거나 오브젝트에 골격 애니메이션이 있는 경우. 골격 애니메이션이 없는 고정 렌더러는 셰이더에 MotionVectors 패스가 있지만 머티리얼에서 비활성화된 경우 오브젝트 모션 벡터 패스로 렌더링되지 않습니다.
사전 빌드 셰이더에 대해 MotionVectors 패스를 활성화하면 Unity는 오브젝트 모션 벡터가 움직이지 않더라도 메시 렌더러에 대해 렌더링합니다.
Unity는 다음 조건이 충족될 때 사전 빌드 URP 셰이더에서 MotionVectors 패스를 활성화합니다.