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에서 스테레오 렌더링과 커스텀 셰이더를 설정하고 사용하는 방법에 대한 참고 자료입니다. 필요한 경우 각 코드와 메소드를 케이스에 맞게 수정 및 활용할 수 있습니다.

Read more

Unity 매뉴얼 스크립팅 API 해설

이 문서는 Unity의 매뉴얼 스크립팅 API에 대한 간단한 해설과 활용 예제들을 포함하고 있습니다. Unity는 게임 개발 플랫폼으로, 스크립팅 API를 통해 게임의 다양한 기능을 제어하고 수정할 수 있습니다. 버전 Unity 스크립팅 API는 여러 버전으로 제공됩니다. 주의 깊게 선택하여 사용하는 것이 중요합니다. 버전 설명 2023.2 최신 기능 및 버그 수정이 추가됨

By 이재협/실장/시스템개발실/PHYSIA

Unity 매뉴얼 스크립팅 API 설명서 해설

이 문서는 Unity의 매뉴얼 스크립팅 API에 대한 정보를 제공하며, 버전에 따라 다르게 적용되는 내용들을 설명합니다. 본 문서에서는 주요 내용을 간단히 정리하고 활용 가능 예제를 통해 이해를 돕겠습니다. 기본 개념 Unity에서 스크립팅 API는 게임 오브젝트와 그들의 동작을 제어하기 위한 강력한 도구입니다. 이를 통해 게임의 로직, 물리 엔진, 애니메이션 및 사용자 인터페이스를

By 이재협/실장/시스템개발실/PHYSIA

Unity 스크립팅 API 가이드

이 문서는 Unity의 스크립팅 API에 대해 설명합니다. Unity는 게임 개발을 위한 인기 있는 엔진으로, 강력한 스크립팅 기능을 제공합니다. 이 가이드는 Unity에서 스크립트를 작성하고 사용하는 방법을 이해하는 데 도움을 드립니다. 목차 * Unity 스크립팅 소개 * 기본 스크립트 생성 * 스크립트 사용 예제 * 응용 프로그램 * 참고 자료 Unity 스크립팅 소개 Unity는 C# 프로그래밍 언어를

By 이재협/실장/시스템개발실/PHYSIA