Version: 2019.3
DX11/OpenGL Core 테셀레이션 지원 표면 셰이더
버텍스 및 프래그먼트 셰이더 예제

버텍스 및 프래그먼트 셰이더 작성

ShaderLab 셰이더는 머티리얼 인스펙터가 표시하는 프로퍼티를 설명하고, 다른 그래픽스 하드웨어에 대한 여러 셰이더 구현을 포함하며, 고정 함수 하드웨어 상태를 구성합니다. 버텍스 및 프래그먼트 프로그램과 같은 프로그래밍 가능 셰이더는 ShaderLab 의 셰이더 개념에 속합니다. 셰이더에 대한 자세한 내용과 소개는 셰이더 튜토리얼을 참조하십시오. 이 페이지에서는 저수준 하드웨어 셰이더 __shader programs__를 간략하게 설명합니다.

조명과 상호작용하는 셰이더를 작성하려면 표면 셰이더 문서를 참조하십시오. 관련 예제는 버텍스 및 프래그먼트 셰이더 예제에서 확인할 수 있습니다. 이 페이지의 나머지 부분은 특수 효과, 포스트 프로세싱 효과 등과 같이 셰이더가 Unity 광원과 상호작용하지 않는다고 가정합니다.

셰이더 프로그램은 HLSL 언어로, 패스 커맨드 내부에서 셰이더 텍스트에 스니핏(코드 조각)을 임베드하여 작성합니다. 보통 예제는 다음과 같습니다.

  Pass {
        // ... the usual pass state setup ...
      
        CGPROGRAM
        // compilation directives for this snippet, e.g.:
        #pragma vertex vert
        #pragma fragment frag
      
        // the Cg/HLSL code itself
      
        ENDCG
        // ... the rest of pass setup ...
    }

HLSL 스니핏

HLSL 프로그램 스니핏은 CGPROGRAMENDCG 키워드 사이 또는 HLSPROGRAMENDHLSL 사이에 작성됩니다. 후자는 자동으로 HLSLSupport와 UnityShaderVariables 빌트인 헤더 파일을 포함하지 않습니다.

스니핏의 시작 부분에 #pragma 명령문을 사용하여 컴파일 지시문을 명시할 수 있습니다. 다음 표에는 어느 셰이더 함수를 컴파일해야 할지 나타내는 지시문이 나와 있습니다.

상태 기능
#pragma vertex name name 함수를 버텍스 셰이더로 컴파일합니다.
#pragma fragment name name 함수를 프래그먼트 셰이더로 컴파일합니다.
#pragma geometry name name 함수를 DX10 지오메트리 셰이더로 컴파일합니다. 이 옵션은 아래 표에 설명된 대로 #pragma target 4.0을 자동으로 활성화합니다.
#pragma hull name name 함수를 DX11 헐 셰이더로 컴파일합니다. 이 옵션은 아래 표에 설명된 대로 #pragma target 5.0을 자동으로 활성화합니다.
#pragma domain name name 함수를 DX11 도메인 셰이더로 컴파일합니다. 이 옵션은 아래 표에 설명된 대로 #pragma target 5.0을 자동으로 활성화합니다.

기타 컴파일 지시문:

상태 기능
#pragma target name 컴파일할 셰이더 타겟을 설정합니다. 자세한 내용은 셰이더 컴파일 타겟 문서를 참조하십시오.
#pragma require feature ... 셰이더에 필요한 GPU 기능을 세세하게 조정합니다. 자세한 내용은 셰이더 컴파일 타겟 문서를 참조하십시오.
#pragma only_renderers space separated names 특정 렌더러에 대해서만 셰이더를 컴파일합니다. 기본적으로 셰이더는 모든 렌더러에 대해 컴파일됩니다.
#pragma exclude_renderers space separated names 특정 렌더러에 대해 셰이더를 컴파일하지 않습니다. 기본적으로 시스템은 모든 렌더러에 대해 컴파일합니다.
#pragma multi_compile ... 여러 셰이더 배리언트로 작업할 때 사용합니다. multi_compile 셰이더의 미사용 배리언트가 게임 빌드에 포함됩니다.
#pragma multi_compile_local ... multi_compile과 유사하지만 열거된 키워드가 로컬입니다. 자세한 내용은 여러 셰이더 프로그램 배리언트 만들기: 키워드 제한 문서를 참조하십시오.
#pragma shader_feature ... 여러 셰이더 배리언트로 작업할 때 사용합니다. shader_feature 셰이더의 미사용 배리언트가 게임 빌드에 포함되지 않습니다.
#pragma shader_feature_local ... shader_feature와 유사하지만 열거된 키워드가 로컬입니다. 자세한 내용은 여러 셰이더 프로그램 배리언트 만들기: 키워드 제한 문서를 참조하십시오.
#pragma enable_d3d11_debug_symbols DirectX 11용으로 컴파일된 셰이더를 위한 디버그 정보를 생성합니다. 이 정보를 가지고 Visual Studio 2012 또는 그 이후 버전의 그래픽스 디버거로 셰이더를 디버그할 수 있습니다.
#pragma hardware_tier_variants renderer name 선택한 셰이더를 구동할 수 있는 하드웨어 티어마다 시스템이 컴파일하는 각 셰이더의 다중 셰이더 하드웨어 배리언트를 생성합니다.
#pragma hlslcc_bytecode_disassembly 디스어셈블된 HLSLcc 바이트코드를 변환된 셰이더에 포함합니다.
#pragma disable_fastmath 정확한 IEEE 754 규칙을 활성화하며, NaN 처리를 포함합니다. 현재에는 Metal 플랫폼에만 영향을 줍니다.
#pragma glsl_es2 GLSL 셰이더에서 설정하면 셰이더 타겟이 OpenGL ES 3인 경우에도 GLSL ES 1.0(OpenGL ES 2.0)을 생성합니다.
#pragma editor_sync_compilation 동기 컴파일을 강제로 실행하며, Unity 에디터에만 영향을 줍니다.
#pragma enable_cbuffer HLSLSupport의 CBUFFER_START(name)CBUFFER_END 매크로를 사용할 때 cbuffer(name)을 방출합니다. 이는 현재 플랫폼이 상수 버퍼를 지원하지 않더라도 마찬가지입니다.

각 스니핏은 최소한 하나의 버텍스 프로그램과 하나의 프래그먼트 프로그램을 포함해야 합니다. 따라서 #pragma vertex#pragma fragment 지시문이 필요합니다.

다음 컴파일 지시문은 아무 동작도 수행하지 않으며 안전하게 제거할 수 있습니다.

  • #pragma glsl
  • #pragma glsl_no_auto_normalization
  • #pragma profileoption
  • #pragma fragmentoption.

Unity는 셰이더 파일에서만 #pragma 지시문을 지원하고 includes에서는 지원하지 않습니다.

렌더링 플랫폼

Unity는 여러 렌더링 API(Direct3D 11 및 OpenGL 등)를 지원하며, 기본적으로 Unity는 모든 셰이더 프로그램을 모든 지원 가능 렌더러로 컴파일합니다. 어느 렌더러를 컴파일할지는 #pragma only_renderers 또는 #pragma exclude_renderers 지시문을 사용하여 지정할 수 있습니다. 특히 일부 플랫폼에서는 사용할 수 없는 일부 셰이더 언어 기능을 사용하고자 하는 경우에 유용합니다. 지원하는 렌더러 이름은 다음과 같습니다.

상태 Renderer
d3d11 Direct3D 11/12
glcore OpenGL 3.x/4.x
gles OpenGL ES 2.0
gles3 OpenGL ES 3.x
metal iOS/Mac Metal
vulkan Vulkan
d3d11_9x Direct3D 11 9.x 기능 레벨, WSA 플랫폼에서 주로 사용
xboxone Xbox One
ps4 PlayStation 4
n3ds Nintendo 3DS
wiiu Nintendo Wii U

아래 예제에서 이 라인은 셰이더를 D3D11 모드로만 컴파일합니다.

# pragma only_renderers d3d11

참고 항목


  • 2019–05–17 페이지 수정됨
  • Unity 2018.1에서 셰이더 #pragma 지시문 추가됨
DX11/OpenGL Core 테셀레이션 지원 표면 셰이더
버텍스 및 프래그먼트 셰이더 예제