Windows 홀로그램 기기(HoloLens)에서는 두 가지 스테레오 렌더링 방법인 멀티 패스와 싱글 패스 인스턴스화가 사용됩니다.
멀티 패스 렌더링에서는 전체 렌더링 패스를 (각 눈마다 한 번씩) 두 번 실행합니다. 따라서 싱글 패스 인스턴스화 렌더링 방법보다 거의 두 배 많은 CPU 작업 부하가 발생합니다. 하지만 이 방법은 역호환성이 가장 우수하고 셰이더를 변경할 필요가 없습니다.
인스턴스화 렌더링에서는 각 드로우 콜이 인스턴스화된 드로우 콜로 대체되는 싱글 렌더링 패스를 수행합니다. 이 렌더링에서는 CPU 사용량이 크게 감소합니다. 두 드로우 콜 사이의 캐시 일관성으로 인해 GPU 사용량도 약간 감소합니다. 따라서 앱의 전력 소비량도 크게 감소합니다.
이 기능을 활성화하려면 플레이어 설정(메뉴: Edit > Project Settings 로 이동한 다음 Player 카테고리 선택)을 열고 Other Settings 패널로 이동하여 Virtual Reality Supported 프로퍼티를 활성화하고, Stereo Rendering Method 드롭다운 메뉴에서 Single Pass Instanced (Fastest) 를 선택합니다.
이 기능을 지원하기 위해 필요한 코드가 스크립트에 포함되지 않은 사용자 셰이더가 있을 수 있으므로, Unity 에디터에서는 기본적으로 더 느린 Multi pass (Slow) 로 설정되어 있습니다.
내장 셰이더가 아닌 셰이더를 인스턴스화와 함께 사용하려면 해당 셰이더를 업데이트해야 합니다. 방법은 GPU 인스턴스화 문서를 참조하십시오. 또한 프래그먼트 셰이더(버텍스/헐/도메인/지오메트리) 전에 사용되는 마지막 셰이더 단계에서 두 가지 사항을 더 변경해야 합니다. 먼저 UNITY_VERTEX_OUTPUT_STEREO
를 출력 구조체에 추가해야 합니다. 둘째, UNITY_SETUP_INSTANCE_ID()
가 호출된 후에 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO()
를 해당 단계의 주 함수에 추가해야 합니다.
Post-Processing Shaders
UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)
매크로를 입력 텍스처 선언 주위에 추가하여 2D 배열이 올바르게 선언되도록 해야 합니다. 다음, 프래그먼트 셰이더의 시작 부분에 있는 UNITY_SETUP_INSTANCE_ID()
에 호출을 추가해야 합니다. 마지막으로, 해당 텍스처를 샘플링할 때 UNITY_SAMPLE_SCREENSPACE_TEXTURE()
매크로를 사용해야 합니다. 기타 유사한 매크로 뎁스 텍스처와 화면 공간 섀도우 맵에 대한 자세한 내용은 HLSLSupport.cginc를 참조하십시오.
다음은 앞에서 언급한 변경 사항을 모두 템플릿 이미지 효과에 적용하는 간단한 예제입니다.
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_TRANSFER_INSTANCE_ID(v, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex);
fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv);
// just invert the colors
col = 1 - col;
return col;
}
Graphics.DrawProceduralIndirect()
와 CommandBuffer.DrawProceduralIndirect()
는 모든 인수를 계산 버퍼에서 가져오므로 인스턴스 수를 쉽게 늘릴 수 없습니다. 그러므로 계산 버퍼에 포함된 인스턴스 수를 수동으로 두 배로 늘려야 합니다.
셰이더 코드에 대한 자세한 내용은 버텍스 및 프래그먼트 셰이더 예제 페이지를 참조하십시오.