Unity 매뉴얼: 스테레오 렌더링 및 커스텀 셰이더
개요
이 문서는 Unity에서 스테레오 렌더링을 설정하고 커스텀 셰이더를 사용하는 방법에 대한 가이드를 제공합니다. 특히 싱글 패스 인스턴스화 렌더링을 지원하는 방법에 대해 설명합니다.
1. 셰이더 업데이트
스테레오 렌더링을 위한 셰이더 업데이트는 다음과 같은 여러 단계를 포함합니다.
1.1 버텍스 입력 속성 구조체 업데이트
UNITY_VERTEX_INPUT_INSTANCE_ID
매크로를 appdata
구조체에 추가합니다.
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};
1.2 버텍스 출력 속성 구조체 업데이트
UNITY_VERTEX_OUTPUT_STEREO
매크로를 v2f
출력 구조체에 추가합니다.
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO //Insert
};
1.3 메인 버텍스 셰이더 함수 업데이트
메인 vert
메서드의 시작 부분에 다음 매크로를 추가합니다.
UNITY_SETUP_INSTANCE_ID();
UNITY_INITIALIZE_OUTPUT(v2f, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO();
1.4 포스트 프로세싱 셰이더 설정
포스트 프로세싱 셰이더가 싱글 패스 스테레오 인스턴싱을 지원하도록 다음 단계를 따릅니다. - UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)
매크로를 추가합니다. - frag
메서드 시작 시 UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i)
추가합니다. - UNITY_SAMPLE_SCREENSPACE_TEXTURE()
매크로를 사용하여 2D 텍스처를 샘플링합니다.
2. 전체 예시 셰이더 코드
아래는 템플릿 이미지 효과 셰이더의 예시입니다. 모든 변경 사항을 적용했습니다.
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_OUTPUT_STEREO //Insert
};
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v); //Insert
UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert
fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert
fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert
col = 1 - col;
return col;
}
3. 셰이더 디버깅
디버깅을 위해 позволяет 사용자 눈에 따라 서로 다른 색상을 표시하는 셰이더를 사용합니다. 이 셰이더는 스테레오 그래픽스의 작동을 확인할 수 있습니다.
Shader "XR/StereoEyeIndexColor"
{
Properties
{
_LeftEyeColor("Left Eye Color", COLOR) = (0,1,0,1)
_RightEyeColor("Right Eye Color", COLOR) = (1,0,0,1)
}
SubShader
{
Tags { "RenderType" = "Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 _LeftEyeColor;
float4 _RightEyeColor;
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert (appdata v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_OUTPUT(v2f, o);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
return lerp(_LeftEyeColor, _RightEyeColor, unity_StereoEyeIndex);
}
ENDCG
}
}
}
4. ShaderGraph 디버그 셰이더
ShaderGraph는 싱글 패스 스테레오 렌더링을 지원하는 데 필요한 매크로를 자동으로 추가합니다. 커스텀 함수 노드를 사용하여 눈 인덱스에 따라 컬러를 설정할 수 있습니다.
위 예시의 커스텀 함수 노드 코드는 다음과 같습니다.
Out = lerp(LeftColor, RightColor, unity_StereoEyeIndex);
이 문서는 Unity에서 스테레오 렌더링과 커스텀 셰이더를 설정하고 사용하는 방법에 대한 참고 자료입니다. 필요한 경우 각 코드와 메소드를 케이스에 맞게 수정 및 활용할 수 있습니다.