Unity는 멀티뷰를 지원하는 Android 기기에서 싱글 패스 스테레오 렌더링을 지원합니다. 멀티뷰는 GL_OVR_multiview2 및 GL_OVR_multiview_multisampled_render_to_texture OpenGL ES 확장으로 구성됩니다. 이러한 확장을 사용하려면 셰이더가 두 개의 슬라이스(눈당 하나의 슬라이스에 대응)로 구성된 2D 텍스처 배열을 사용해야 합니다.
커스텀 셰이더와 함께 싱글 패스 스테레오 렌더링을 사용하려면 추가 셰이더 코드를 포함해야 할 수 있습니다. 커스텀 셰이더가 다음과 같은 경우 추가 코드를 포함할 필요가 없습니다.
참고: 이러한 셰이더 변경 사항은 멀티 패스 스테레오 렌더링과 호환됩니다.
GPU가 렌더링되는 눈을 알기 위해 unity_StereoEyeIndex 빌트인 셰이더 변수를 사용하려는 경우 셰이더 단계 출력 구조체에서 UNITY_VERTEX_OUTPUT_STEREO를 선언해야 합니다. 예시:
struct v2f {
float2 uv : TEXCOOR0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO
};
출력 데이터를 초기화하려면 버텍스 셰이더 함수의 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO()를 사용합니다. 예시:
v2f vert (appdata v)
{
v2f o;
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
후속 단계에서 unity_StereoEyeIndex를 초기화하려면 처음에 UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()를 추가합니다. 예시:
fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
셰이더가 다른 셰이더 단계를 사용한다면 UNITY_TRANSFER_VERTEX_OUTPUT_STEREO() 매크로를 사용하여 눈 인덱스를 후속 단계로 전송해야 합니다.
팁: 오브젝트의 최종 위치를 계산하려면 mul(UNITY_MATRIX_MVP, IN.vertex) 대신 UnityObjectToClipPos(IN.vertex)를 사용하는 것이 좋습니다.
눈 텍스처가 2D 텍스처 배열인 경우 포스트 프로세싱 셰이더를 업데이트해야 합니다. 이를 지원하기 위해 Unity에는 UNITY_DECLARE_SCREENSPACE_TEXTURE() 매크로가 포함되어 있습니다. 멀티 패스와 싱글 패스 모드에서 텍스처가 작동하도록 만들려면 이 매크로에서 각 텍스처를 래핑합니다. 또한 텍스처를 샘플링할 때 UNITY_SAMPLE_SCREENSPACE_TEXTURE() 매크로를 사용합니다.
이 매크로는 싱글 패스 모드일 때 UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX()를 미리 호출해야 합니다. Unity에는 뎁스 텍스처와 스크린 공간 섀도우 맵을 위한 유사한 매크로도 포함되어 있습니다. HLSLSupport.cginc 하단에서 전체 리스트를 볼 수 있습니다.