Version: 2018.4
언어: 한국어
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 키워드 사이, 또는 HLSLPROGRAMENDHLSL 사이에 작성됩니다. 후자는 자동으로 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 … - 멀티플 셰이더 배리언트와 함께 사용합니다.
  • #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 vertex#pragma fragment 지시문이 필요합니다.

다음 컴파일 지시문은 Unity 5.0부터는 아무 동작도 하지 않으며 따라서 안전하게 제거할 수 있습니다. #pragma glsl, #pragma glsl_no_auto_normalization, #pragma profileoption, #pragma fragmentoption.

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

렌더링 플랫폼

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

  • 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

참고 항목


  • 2018–03–20 편집 리뷰를 거쳐 페이지 수정됨
  • Unity 2018.1에서 셰이더 #pragma 지시문 추가됨
DX11/OpenGL Core 테셀레이션 지원 표면 셰이더
버텍스 및 프래그먼트 셰이더 예제