HoloLens 개발 메모 #2

Holographic API는 RenderTexture Array를 이용해서 해서 양쪽 눈 각각에 대해 렌더링을 수행한다. 이게 분명히 성능상 이득이 있다.
문제는 이렇게 만들려니 기존 코드를 와장창 갈아엎어야한다. 일단 Holograhic 디바이스에서 사용하는지 아닌지 여부에 따라 shader코드와 렌더링 코드가 달라져야 한다.

기본적으로 HoloLens디바이스는 DX11.3을 준수하므로 Shader의 모든 스테이지에서 SV_RenderTargetArrayIndex를 지정할 수 있다. 하지만 에뮬레이터의 경우 에뮬레이터를 실행하는 PC의 GPU가 스펙을 따른다. 따라서 에뮬레이터에선 11.3스펙을 보장할수 없다. 결국 에뮬레이터를 고려하여 SV_RenderTargetArrayIndex를 지정하는Geometry Shader를 작성하고 이를 통해서 렌더링 하도록 해야한다.

엔진이 실행되는 디바이스가 Holograhic디바이스가 아닌 경우 SV_RenderTargetArrayIndex를 지정할 필요가 없고 이런 Geometry Shader는 필요가 없다. 성능 저하를 줄이기 위해 경우는 Geometry Shader를 건너뛰고 Pixel Shader를 바로 호출하도록 해야한다.

또 엔진에서 사용중인 Render Target들도 Array형태로 만들어야 한다. 이것도 Holographic 디바이스에서 사용하는지 아닌지 여부에 따라 코드가 달라진다.
반사나 그림자등 별도의 목적으로 사용하는 Render Target의 경우는 양쪽 눈에 대해서 따로 렌더링할 필요가 없으므로(사실 엄밀히 따지면 이것도 하는것이 맞지만…느낄수 없는 차이를 위해 Draw를 두번 할 필요는 없다) Array를 사용하지 않는다.

Deferred 쉐이딩이냐 아니냐에 따라서도 또 코드가 달라진다. GBuffer Shader에서도 Shader Resource View로 사용할 GBuffer 리소스들에 대해서 인덱싱을 해야한다. 현재 어떤 Render Target Index가 지정되었는지에 따라 GBuffer 리소스도 인덱싱을 해야한다. 당연히 GBuffer 리소스도 Array형태로 받아야한다. 이 또한 Holographic 디바이스를 사용하는지 여부에 따라 Texture2D로 받을지 , Texture2DArray로 받을지 달라진다.

1월 1일 전에 HoloLens용 엔진을 완성지으려고 했으나 생각보다 복잡해서 계속 늦어지고 있다. 코드 양도 많고 모든 shader코드를 한번에 고칠 경우 뒷감당이 안되기 때문에 점진적으로 고치고 테스트하기를 반복하고 있다.

HoloGraphic API에 맞춰서 필요한 모든 RenderTarget을 Array형태로 바꿨다. Defered Shading과 Post-Processing에 대해서도 모두 적용하고 테스트 완료.
데스크탑 버전은 여기까지해서 준비 끝났고 이제 다시 HoloLens용 UWP프로젝트에 변경된 코드들을 적용시켜야 한다.

2016_1218_rtv_array.png


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중