Version: 2020.3
ShaderLab: 빌트인 렌더 파이프라인의 사전 정의된 패스 태그
ShaderLab: 커맨드

ShaderLab: 셰이더 프로그램 추가

Unity에서는 보통 HLSL에서 셰이더 프로그램을 작성합니다. 셰이더 에셋에 HLSL 코드를 추가하려면 셰이더 코드 블록 내에 코드를 넣습니다.

이 페이지는 셰이더 코드 블록을 사용하는 방법에 대한 정보를 포함합니다. HLSL 자체를 작성하는 방법을 알아보려면 Unity에서 HLSL 사용을 참조하십시오.

참고: 비록 필요하거나 권장되지는 않으나, Unity는 다른 언어로 셰이더 프로그램을 작성하는 것도 지원합니다. 자세한 내용은 셰이더 작성을 참조하십시오.

렌더 파이프라인 호환성

기능 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 스크립터블 렌더 파이프라인
HLSLPROGRAM 지원 지원 지원 지원
HLSLINCLUDE 지원 지원 지원 지원
CGPROGRAM 지원 지원 안 함 지원 안 함 지원

SRP Core 패키지를 사용하는 커스텀 렌더 파이프라인과 호환 불가
CGINCLUDE 지원 지원 안 함 지원 안 함 지원

SRP Core 패키지를 사용하는 커스텀 렌더 파이프라인과 호환 불가

셰이더 코드 블록 타입

다음 셰이더 코드 블록 타입을 사용하여 HLSL 코드를 추가할 수 있습니다.

  • HLSLPROGRAM
  • CGPROGRAM
  • HLSLINCLUDE
  • CGINCLUDE

언제 어느 타입을 사용해야 하는지 이해하려면 타입의 프리픽스(HLSL 또는 CG)와 접미사(PROGRAM 또는 INCLUDE)를 모두 이해해야 합니다.

HLSL 및 CG 프리픽스

HLSLCG로 시작하는 블록의 차이는 다음과 같습니다.

  • 프리픽스 CG로 시작하는 셰이더 코드 블록이 더 오래되었습니다. 이러한 코드 블록은 기본적으로 Unity의 빌트인 셰이더 include 파일을 여러 개 포함하므로 이 기능이 필요한 경우 매우 편리합니다. 빌트인 include는 빌트인 렌더 파이프라인과만 호환됩니다.
  • 프리픽스 HLSL로 시작하는 셰이더 코드 블록은 보다 최근의 것으로, Unity의 빌트인 셰이더 include 파일을 기본적으로 포함하지 않으므로 사용할 라이브러리 코드를 수동으로 포함해야 합니다. 이 코드 블록은 모든 렌더 파이프라인과 함께 사용할 수 있습니다.

Unity의 빌트인 셰이더 include 파일에 대한 내용은 빌트인 셰이더 include 파일을 참조하십시오.

PROGRAM 및 INCLUDE 접미사

PROGRAMINCLUDE로 시작하는 블록의 차이는 다음과 같습니다.

  • PROGRAM으로 끝나는 셰이더 코드 블록을 셰이더 프로그램 블록이라고 하며, 셰이더 프로그램을 작성하는 데 사용합니다. HLSL 셰이더 코드를 이러한 블록 내에 작성한 다음 ShaderLab 코드의 패스 블록 안에 넣습니다.
  • INCLUDE로 끝나는 셰이더 코드 블록을 셰이더 include 블록이라고 하며, 같은 소스 파일 내 셰이더 프로그램 블록 간 일반적인 코드를 공유하는 데 사용합니다. 이러한 블록 내에서 공유할 HLSL 셰이더 코드를 작성한 다음 ShaderLab 코드 내 패스, 서브셰이더 또는 셰이더 블록 안에 넣습니다. HLSL 코드에서 include를 사용하는 방법과 비슷하게 작동합니다.

셰이더 프로그램 블록 사용

서명 기능
HLSLPROGRAM
    [source code for shader programs, written in HLSL]
ENDHLSL
이 셰이더 프로그램 블록을 포함하는 패스에 HLSL 셰이더 프로그램을 추가합니다. Unity의 빌트인 셰이더 include 파일은 포함하지 않습니다.
CGPROGRAM
    [source code for shader programs, written in HLSL]
ENDCG
이 셰이더 프로그램 블록을 포함하는 패스에 HLSL 셰이더 프로그램을 추가합니다. Unity의 빌트인 셰이더 include 파일을 여러 개 포함하므로 빌트인 변수와 함수를 사용할 수 있습니다.

예제

Shader "Examples/ExampleShader"
{
    SubShader
    {
        Pass
        {                
              Name "ExamplePassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // ShaderLab commands to set the render state go here

              HLSLPROGRAM
                // HLSL shader code goes here
              ENDHLSL
        }
    }
}

셰이더 include 블록 사용

서명 기능
HLSLINCLUDE
    [HLSL code that you want to share]
ENDHLSL
Unity는 이 소스 파일 어디에서든 이 코드를 HLSLPROGRAM 블록에 정의된 모든 셰이더 프로그램에 포함합니다.
CGINCLUDE
    [HLSL code that you want to share]
ENDCG
Unity는 이 소스 파일 어디에서든 이 코드를 CGPROGRAM 블록에 정의된 모든 셰이더 프로그램에 포함합니다.

예제

Shader "Examples/ExampleShader"
{
    SubShader
    {

        HLSLINCLUDE
            // HLSL code that you want to share goes here
        ENDHLSL

        Pass
        {                
              Name "ExampleFirstPassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // ShaderLab commands to set the render state go here

              HLSLPROGRAM
                // This HLSL shader program automatically includes the contents of the HLSLINCLUDE block above
                // HLSL shader code goes here
              ENDHLSL
        }

        Pass
        {                
              Name "ExampleSecondPassName"
              Tags { "LightMode" = "ExampleLightModeTagValue" }

              // ShaderLab commands to set the render state go here

              HLSLPROGRAM
                // This HLSL shader program automatically includes the contents of the HLSLINCLUDE block above
                // HLSL shader code goes here
              ENDHLSL
        }

    }
}
ShaderLab: 빌트인 렌더 파이프라인의 사전 정의된 패스 태그
ShaderLab: 커맨드