AnyPortrait > 메뉴얼 > 여러 개의 카메라로 렌더링하기
게임 씬을 구성하다보면 기법에 따라서는 하나의 오브젝트를 2개 이상의 카메라로 렌더링을 하는 경우가 있습니다.
AnyPortrait로 제작한 캐릭터는 Mesh Renderer들로 구성되기 때문에 일반적으로는 문제가 없습니다.
다만, "클리핑 마스크"는 카메라와 연동해서 동작하기 때문에, 2개 이상의 카메라가 있는 씬에서는 오작동을 하기가 쉽습니다.
이 페이지에서는 카메라가 2개 이상일 때와 씬에서의 카메라 구성이 변경되었을 때 각각 발생하는 클리핑 마스크의 렌더링 오류를 해결하는 방법에 대해서 설명합니다.
참고
이 페이지의 설명은 카메라의 렌더 텍스쳐를 이용하는 기법과도 관련이 있습니다.
렌더 텍스쳐를 타겟으로 렌더링하는 카메라에 대한 설명은 관련 페이지에서 확인할 수 있습니다.
(1) 유니티 씬에 1개의 캐릭터와 (2) 3개의 카메라가 있습니다.
(3) 이 중, 2개의 카메라가 캐릭터를 렌더링하고 있으므로, Game View에서는 캐릭터가 두번 렌더링됩니다.
게임을 실행하면 캐릭터의 눈이 제대로 렌더링되지 않는 것을 볼 수 있습니다.
캐릭터의 눈은 클리핑 마스크를 이용하여 렌더링이 되는데, 두번째 카메라부터는 클리핑 마스크가 제대로 동작하지 않았기 때문입니다.
AnyPortrait는 메시를 클리핑하여 렌더링을 하기 위해서 "렌더 텍스쳐(Render Texture)"와 "커맨드 버퍼(Command Buffer)"를 이용합니다.
"커맨드 버퍼"는 카메라에 입력되는 일종의 렌더링 요청입니다.
즉, 클리핑 마스크 기법을 위해서 캐릭터는 자신을 렌더링하는 카메라를 찾아서 렌더링 요청을 해야 합니다.
일반적으로 오브젝트를 1개의 카메라가 렌더링하기 때문에, AnyPortrait의 캐릭터도 1개의 카메라만 찾는 것이 기본입니다.
만약, 2개 이상의 카메라로 렌더링을 하고자 한다면 이와 관련된 옵션을 변경해야합니다.
(1) AnyPortrait 에디터를 열고 Bake 버튼을 누릅니다.
(2) Setting 탭을 선택합니다.
(3) "VR / Multi-Camera" 옵션의 값을 "Multiple Cameras"로 변경합니다.
"VR / Multi-Camera"은 렌더링 처리시 감지할 카메라의 최대 개수와 특성을 미리 알려주는 옵션입니다.
옵션의 값들은 다음과 같습니다.
- None : 1개의 카메라만 캐릭터를 렌더링하는 것으로 간주합니다.
- Single Camera and Eye Textures (Unity VR) : 유니티의 VR은 1개의 카메라로 두번 렌더링을 하는 처리를 하므로 별도의 처리가 필요합니다. VR에 대해서는 관련 페이지를 참고해주세요.
- Multiple Cameras : 2개 이상의 카메라가 캐릭터를 렌더링하는 경우 이 값이 설정되어야 합니다. 커맨드 버퍼를 생성하기 위해 모든 카메라를 대상으로 유효성을 테스트합니다.
Bake를 실행하고 유니티 씬으로 돌아가서 게임을 실행하면 위와 같이 모든 카메라에서 클리핑 마스크가 정상적으로 동작하는 것을 볼 수 있습니다.
클리핑 마스크의 렌더링 문제는 씬에 배치된 카메라가 추가되거나 삭제될 때도 발생합니다.
Bake에서의 설정을 변경하여 다중 카메라에서 렌더링 문제가 해결되었다 하더라도, 카메라가 삭제, 추가되는 과정에서 다시 렌더링 문제가 발생합니다.
AnyPortrait가 클리핑 마스크를 렌더링하기 위해서는 카메라를 찾아서 커맨드 버퍼를 입력해야합니다.
만약 새로운 카메라가 게임 도중에 추가되었다면, 그 카메라를 캐릭터가 인식하여 커맨드 버퍼를 추가로 입력해야 할 것입니다.
즉, "새로운 카메라가 추가되었다는 사실"을 캐릭터가 인지하게 만들어서 커맨드 버퍼가 다시 생성되면 문제가 해결될 것입니다.
이 접근법을 수행하는 두가지 방법이 있습니다.
첫번째 방법은 "스크립트를 이용하여 카메라의 변경 사실을 직접 알려주는 것"이고, 두번째 방법은 "캐릭터가 항상 모든 카메라들을 감지하고 있도록 설정하는 것"입니다.
다음의 설명을 보시고 편한 방법을 이용하여 문제를 해결하면 되겠습니다.
카메라의 개수나 정보가 변경될 때, apPortrait의 "SetRenderingCameras" 함수를 호출하여 렌더링 문제를 해결할 수 있습니다.
"SetRenderingCameras" 함수는 "캐릭터를 렌더링하는 카메라들"을 apPortrait에 알려주는 역할을 합니다.
함수 인자로 캐릭터를 렌더링하는 카메라들만 취합해서 입력을 해야합니다.
하지만 이 함수는 유효성 테스트를 포함하므로, 씬의 모든 카메라들(Camera.allCameras)을 입력해도 됩니다.
다음은 해당 함수를 호출하는 스크립트 예시입니다.
(카메라의 추가, 삭제를 수행하는 코드는 생략되었습니다.)
using UnityEngine;
using AnyPortrait;
public class CameraChangeScript : MonoBehaviour
{
// 대상인 apPortrait
public apPortrait portrait;
void Update()
{
// A키를 누르면 카메라를 씬에 추가합니다.
if ( Input.GetKeyDown( KeyCode.A ) )
{
// 카메라를 추가합니다.
AddCamera();
// 카메라가 변경되었음을 캐릭터에 알립니다.
portrait.SetRenderingCameras(Camera.allCameras);
}
// S키를 누르면 카메라를 삭제합니다.
if ( Input.GetKeyDown( KeyCode.S ) )
{
// 추가되었던 카메라를 삭제합니다.
RemoveCamera();
// 카메라가 변경되었음을 캐릭터에 알립니다.
portrait.SetRenderingCameras(Camera.allCameras);
}
}
(생략)
}
(1) AnyPortrait 에디터를 열고 Bake 버튼을 누릅니다.
(2) Setting 탭을 선택합니다.
(3) "Check Cameras" 옵션을 "All Scene Cameras"로 변경하고 Bake를 실행합니다.
AnyPortrait 시스템은 게임 중에 카메라가 변경되면 자동으로 카메라들을 다시 검색하여 클리핑 마스크 렌더링을 위한 준비를 합니다.
여기서 중요한 점은 "카메라가 변경되는 것"을 감지하는 방식입니다.
"Check Cameras" 옵션은 씬에서 카메라가 변경되는 것을 감지하는 방식을 결정합니다.
- Current Camera Mainly : 현재의 카메라가 비활성화되는 경우에만 카메라들을 다시 검색합니다.
- All Scene Cameras : 씬에 위치한 모든 카메라들을 매프레임마다 확인합니다. 카메라 변경이 잦은 경우에 유용합니다.
위 방법들 중 하나를 적용하면 카메라의 추가, 삭제 시의 렌더링 에러가 해결되는 것을 볼 수 있습니다.
AnyPortrait는 클리핑 마스크 처리를 위해서 "렌더 텍스쳐"를 사용합니다.
일반적으로 고품질의 마스크 처리를 위해서는 큰 해상도의 렌더 텍스쳐가 필요할 것입니다.
그렇지만 AnyPortrait는 낮은 해상도에서도 마스크의 품질을 높일 수 있는 최적화 기능을 가지고 있습니다.
낮은 해상도의 렌더 텍스쳐로 고품질의 렌더링을 할 수 있는 "클리핑 마스크 해상도 최적화" 기능은 다음의 조건이 모두 충족될 때 수행됩니다.
1. 캐릭터를 렌더링하는 모든 카메라가 Orthographic 타입이어야 합니다.
2. 캐릭터를 렌더링하는 모든 카메라가 캐릭터를 정면으로 쳐다보고 있어야 합니다.
만약, 위 조건을 충족하지 않는다면 최적화 기능은 동작하지 않으며, 렌더 텍스쳐의 해상도에 따라 클리핑 마스크의 품질이 결정됩니다.
최적화 기능은 최대한 동작하도록 구현되어 있지만, 여러 개의 카메라가 있는 씬에서는 최적화를 위한 조건이 충족되지 않을 수 있습니다.
만약 이 문제를 겪고 있다면, 다음의 방법으로 문제를 해결해보세요.
(1) 캐릭터를 렌더링하는 여러 개의 카메라 중 하나를 선택합니다.
(2) 카메라를 회전시키고, Perspective 타입으로 변경해보았습니다.
클리핑 마스크 해상도 최적화가 동작하지 않게 되어 캐릭터의 눈 부위가 낮은 품질로 렌더링되는 것을 볼 수 있습니다.
클리핑 마스크의 렌더 텍스쳐 해상도를 높여서 렌더링 품질을 향상시킬 수 있습니다.
(1) 메시 그룹을 선택합니다.
(2) Setting 탭을 선택합니다.
(3) 클리핑 마스크인 메시를 선택합니다.
(4) Mask Texture Size 속성을 변경합니다. 이 값은 클리핑 렌더링을 위한 렌더 텍스쳐의 해상도이므로, 값이 클 수록 렌더링 품질이 좋아집니다.
Bake를 하고 게임을 실행하면 클리핑 마스크의 품질이 좋아진 것을 볼 수 있습니다.