기술 자료

Unity Engine

Unity Engine

Android용 싱글 패스 스테레오 렌더링

Explains how to use single-pass stereo rendering in your Android application.
읽는 시간 2분최근 업데이트: 한 달 전

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
하단에서 전체 리스트를 볼 수 있습니다.