Version: 5.3
DX11/OpenGL Core 테셀레이션 지원 표면 셰이더
Vertex and Fragment Shader Examples

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

ShaderLab 셰이더는 “하드웨어 셰이더” 외에도 넓은 범위를 포괄하며, 다양한 기능을 수행합니다. 머티리얼 인스펙터에 표시되는 프로퍼티를 설명하고, 서로 다른 그래픽 하드웨어용셰이더를 여러 개 구현하며, 고정 함수 하드웨어 상태를 설정합니다. 버텍스 및 프래그먼트 프로그램과 같은 실제 프로그래밍 가능 셰이더는 ShaderLab 전체의 “셰이더” 개념의 일부일 뿐입니다. 기본 개요는 셰이더 튜토리얼을 참조하십시오. 여기에서 로우 레벨 하드웨어 셰이더를 shader programs 라고 합니다.

If you want to write shaders that interact with lighting, take a look at Surface Shaders documentation. For some examples, take a look at Vertex and Fragment Shader Examples. The rest of this page will assume shaders that do not interact with Unity lights (e.g. special effects, Image Effects etc.)

Shader programs are written in Cg/HLSL language, by embedding “snippets” in the shader text, somewhere inside the Pass command. They usually look like this:

  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 ...
    }

Cg/HLSL snippets

Cg/HLSL program snippets are written between CGPROGRAM and ENDCG.

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

  • #pragma vertex name - compile function name as the vertex shader.
  • #pragma fragment name - compile function name as the fragment shader.
  • _#pragma geometry name_ - compile function name as DX10 geometry shader. Having this option automatically turns on #pragma target 4.0, described below.
  • _#pragma hull name_ - compile function name as DX11 hull shader. Having this option automatically turns on #pragma target 5.0, described below.
  • _#pragma domain name_ - compile function name as DX11 domain shader. Having this option automatically turns on #pragma target 5.0, described below.

기타 컴파일 지시문:

  • #pragma target name - which shader target to compile to. See Shader Compilation Targets page for details.
  • #pragma only_renderers space separated names - compile shader only for given renderers. By default shaders are compiled for all renderers. See Renderers below for details.
  • #pragma exclude_renderers space separated names - do not compile shader for given renderers. By default shaders are compiled for all renderers. See Renderers below for details.
  • #pragma multi_compile …_ - for working with multiple shader variants.
  • #pragma enable_d3d11_debug_symbols - DirectX 11용으로 컴파일된 셰이더를 위한 디버그 정보를 생성합니다. 이 정보를 가지고 Visual Studio 2012 또는 그 이후 버전의 그래픽스 디버거로 셰이더를 디버그할 수 있습니다.

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

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

렌더링 플랫폼

Unity supports several rendering APIs (e.g. Direct3D 9 and OpenGL), and by default all shader programs are compiled into all supported renderers. You can indicate which renderers to compile to using #pragma only_renderers or #pragma exclude_renderers directives. This is mostly useful in cases where you are explicitly using some shader language features that you know aren’t possible on some platforms. Currently supported renderer names are:

  • d3d9 - Direct3D 9.
  • d3d11 - Direct3D 11/12.
  • glcore - OpenGL 3.x/4.x.
  • gles - OpenGL ES 2.0.
  • gles3 - OpenGL ES 3.x.
  • metal - iOS/Mac Metal.
  • d3d11_9x - Direct3D 11 9.x feature level, as commonly used on WSA/WP8 platforms.
  • xbox360 - Xbox 360.
  • xboxone - Xbox One.
  • ps3 - PlayStation 3.
  • ps4 - PlayStation 4.
  • psp2 - PlayStation Vita.
  • n3ds - Nintendo 3DS.
  • wiiu - Nintendo Wii U.

예를 들어, 다음 라인은 셰이더를 D3D9 모드로만 컴파일합니다.

#pragma only_renderers d3d9

참고 항목

DX11/OpenGL Core 테셀레이션 지원 표면 셰이더
Vertex and Fragment Shader Examples