Unity의 셰이더는 ShaderLab과 GPU 프로그래밍 언어(HLSL/Cg)를 함께 사용하여 작성된다.

CGPROGRAM ~ ENDCG 사이에 GPU에서 실행될 코드를 작성해야 한다.

Unity는 예전부터 Cg 언어를 기반으로 했지만, 현재는 HLSL이 공식적으로 사용된다.

따라서 CGPROGRAM 대신 HLSLPROGRAM을 사용할 수 있다.

  • CGPROGRAM은 GPU에서 실행될 셰이더 코드 작성 영역

  • HLSLPROGRAM을 사용하면 최신 Unity(URP, HDRP)에서도 호환 가능

CGPROGRAM과 HLSLPROGRAM 비교

CGPROGRAM (기존 Unity 셰이더)

Pass
{
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #include "UnityCG.cginc"
    
    struct appdata_t {  };
    struct v2f {  };
    
    v2f vert (appdata_t v) {  }
    fixed4 frag (v2f i) : SV_Target {  }
    
    ENDCG
}
  • Cg 기반의 셰이더 코드 작성
  • #pragma vertex, #pragma fragment 를 사용하여 각 단계의 함수 지정
  • UnityCG.cginc를 포함하여 유틸리티 함수 사용 가능

HLSLPROGRAM (최신 Unity 버전, URP/HDRP 호환)

Pass
{
    HLSLPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"
    
    struct appdata_t {  };
    struct v2f {  };
    
    v2f vert (appdata_t v) {  }
    float4 frag (v2f i) : SV_Target {  }
    
    ENDHLSL
}
  • HLSL 기반의 최신 셰이더 코드
  • CGPROGRAM 대신 HLSLPROGRAM 사용
  • ENDCG 대신 ENDHLSL 사용
  • UnityCG.cginc 대신 Common.hlsl 포함

URP(HDRP)와 호환되는 최신 셰이더 코드 작성 가능

CGPROGRAM / HLSLPROGRAM 적용 예제

기본 CGPROGRAM을 사용하는 셰이더

Shader "Custom/CGExample"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.uv, 0, 1);
            }
            ENDCG
        }
    }
}

CGPROGRAM을 사용하여 기본적인 UV 색상 셰이더 구현


HLSLPROGRAM을 사용하는 최신 셰이더

Shader "Custom/HLSLExample"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(v.vertex); // URP, HDRP에서 사용하는 변환 함수
                o.uv = v.uv;
                return o;
            }

            float4 frag (v2f i) : SV_Target
            {
                return float4(i.uv, 0, 1);
            }
            ENDHLSL
        }
    }
}

HLSLPROGRAM을 사용하여 최신 Unity(URP, HDRP)에서 호환 가능하도록 작성

버텍스 변환 함수(TransformObjectToHClip)를 사용하여 HLSL 스타일로 변환

댓글남기기