표면 쉐이더와 DX11 테셀레이션
Vertex and Fragment Shader Examples

정점 쉐이더와 Fragment 쉐이더의 프로그래밍

ShaderLab은 단순한 하드웨어 쉐이더 이상의 기능을 포함합니다. 많은 것이 있습니다. 먼저 Properties는 ​​메테리얼의 인스펙터에 표시하거나, 다른 그래픽 하드웨어에서 동작할 수 있도록 여러 쉐이더를 포함하고, 하드웨어가 준비한 고정 함수 조정등을 합니다. 실제 프로그래머블 쉐이더(정점 쉐이더와 Fragment 쉐이더 프로그램과 같은)는 ShaderLab의 쉐이더 개념의 일부입니다. Shader Tutorial에서 기본적인 설명을합니다. 여기에서는 로우 레벨에 가까운 하드웨어 쉐이더를 shader programs이라고 부르겠습니다.

만약 라이팅에 반응하는 쉐이더를 작성하고 싶다면, Surface Shaders 문서를 읽어보십시오. 또한 샘플을 원하시는 경우 Vertex and Fragment Shader Examples를 참조하십시오. 여기에서는 Unity의 라이트에서 반응하지 않는 쉐이더에 대해 언급합니다. (예 : 특수 효과, Image Effects 등)

Shader programs은 Cg/HLSL 언어로 작성되어 있습니다. 쉐이더 텍스트 안에 Pass 명령에서 “미리보기”가 포함됩니다. 대체로 다음과 같은 느낌입니다 :

  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 스니펫(Cg snippets)

Cg 프로그램 스니펫은 CGPROGRAMENDCG 사이에 작성됩니다.

우선 #pragma 명령문으로 시작합니다. 이 명령은 컴파일하기 위해 어떤 쉐이더 함수인지를 가리킵니다. :

  • #pragma vertex name - 정점 쉐이더로 정의되는 name 이라는 이름의 함수
  • #pragma fragment name - Fragment 쉐이더로 정의되는 name 이라는 이름의 함수
  • #pragma geometry name - DX10 지오메트리 쉐이더로 정의되는 name 이라는 이름의 함수. 이 옵션은 자동으로 #pragma target 4.0을 켭니다. 자세한 내용은 아래를 보십시오.
  • #pragma hull name - DX11의 Hull 쉐이더로 정의되는 name 이라는 이름의 함수. 이 옵션은 자동으로 #pragma target 5.0을 켭니다. 자세한 내용은 아래를 보십시오.
  • #pragma domain name - DX11의 Domain 쉐이더로 정의되는 name 이라는 이름의 함수. 이 옵션은 자동으로 #pragma target 5.0을 켭니다. 자세한 내용은 아래를 보십시오.

기타 컴파일 명령 :

  • #pragma target name - 컴파일 쉐이더 대상 지정. 자세한 내용은 Shader targets 을 참조하십시오.
  • #pragma only_renderers space separated names - 지정 렌더러만 쉐이더를 컴파일합니다. 기본적으로 모든 렌더러의 쉐이더가 컴파일됩니다. 자세한 내용은 renderers를 참조하십시오.
  • #pragma exclude_renderers space separated names - 지정 렌더러만 쉐이더를 컴파일하지 않습니다. 기본적으로 모든 렌더러의 쉐이더가 컴파일됩니다. 자세한 내용은 renderers를 참조하십시오.
  • #pragma multi_compile …_ - for working with multiple shader variants.
  • #pragma enable_d3d11_debug_symbols - generate debug information for shaders compiled for DirectX 11, this will allow you to debug shaders via Visual Studio 2012 (or higher) Graphics debugger.

Each snippet must contain at least a vertex program and a fragment program. Thus #pragma vertex and #pragma fragment directives are required.

Compilation directives that don’t do anything starting with Unity 5.0 and can be safely removed: #pragma glsl, #pragma glsl_no_auto_normalization, #pragma profileoption, #pragma fragmentoption.

렌더링 플랫폼

Unity는 일부 렌더링 API(즉 Direct3D 9 및 OpenGL)을 지원하며 기본적으로 모든 쉐이더 프로그램은 지원되는 렌더러에 컴파일됩니다. 어떤 렌더러에 컴파일할 지는 #pragma only_renderers 또는 #pragma exclude_renderers 지시어로 지정할 수 있습니다. 이것은 어떤 플랫폼 상에서 사용불가능한 특정 쉐이더 기능을 명시적으로 사용하고 있을 경우에 유용합니다.현재 지원되는 렌더러 이름은:

  • d3d9 - Direct3D 9.
  • d3d11 - Direct3D 11/12.
  • #pragma target 3.0 - 대상을 쉐이더 모델 3.0으로 컴파일 :
  • 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 테셀레이션
Vertex and Fragment Shader Examples