Version: 2019.2
Поверхностные шейдеры с использованием тесселяции DX11
Примеры вершинных и фрагментных шейдеров

Программирование вершинных и фрагментных (пиксельных) шейдеров

ShaderLab шейдеры включают в себя не только “аппаратные шейдеры”. Они делают многое. Они описывают свойства, которые отображаются в Material Inspector, содержат реализации шейдера под различное аппаратное обеспечение, настраивают состояние аппаратного fixed function и.т.д. В действительности программируемые шейдеры - такие как вертексные или фрагментные программы - всего лишь часть концепции “шейдера” ShaderLab. Для базового ознакомления взгляните на Урок по шейдерам. Здесь и далее мы будем называть низкоуровневые аппаратные шейдеры - шейдерная программа.

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 assumes shaders do not interact with Unity lights (for example special effects, post-processed effects etc.)

Shader programs are written in 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 ...
  }

HLSL snippets

HLSL program snippets are written between CGPROGRAM and ENDCG keywords, or alternatively between HLSLPROGRAM and ENDHLSL. The latter form does not automatically include HLSLSupport and UnityShaderVariables built-in header files.

В начале программы шейдера могут быть заданы директивы компиляции #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 в качестве domain шейдера DX11. Наличие этой директивы автоматически включает опцию #pragma target 5.0, которая описана ниже.

Прочие директивы компиляции:

  • #pragma fragment name_ - Компилировать функцию name в качестве фрагментного (пиксельного).
  • #pragma require feature … - fine grained control on which GPU features a shader needs, see Shader Compilation Targets page for details.
  • #pragma only_renderers имена рендереров через пробел_ - Компилировать шейдер только для указанных рендереров. По умолчанию шейдер компилируется для всех рендереров. Подробнее см. Renderers ниже.
  • #pragma exclude_renderers имена рендереров через пробел_ - не компилировать шейдер для указанных рендереров. По умолчанию шейдер компилируется для всех рендереров. Подробнее см. Renderers ниже.
  • #pragma multi_compile … - for working with multiple shader variants. Unused variants of multi_compile shaders are included in the game build.
  • #pragma multi_compile_local … - similar to multi_compile, but enumerated keywords are local. See Making multiple shader program variants: Keyword limits for more information.
  • #pragma shader_feature … - for working with multiple shader variants. Unused variants of shader_feature shaders are not included in the game build.
  • #pragma shader_feature_local … - similar to shader_feature, but enumerated keywords are local. See Making multiple shader program variants: Keyword limits for more information.
  • #pragma enable_d3d11_debug_symbols - генерировать отладочную информацию для шейдеров скомпилированных под DirectX 11, это позволит вам отлаживать шейдеры с помощью отладчика графики в Visual Studio 2012 (или выше).
  • #pragma hardware_tier_variants renderer name - generate multiple shader hardware variants of each compiled shader, for each hardware tier that could run the selected renderer. See Renderers below for details.
  • #pragma hlslcc_bytecode_disassembly - embed disassembled HLSLcc bytecode into translated shader.
  • #pragma disable_fastmath - enables precise IEEE 754 rules, mostly involving NaN handling (currently only affects Metal platform).
  • #pragma glsl_es2 - When set in a GLSL shader, generate a GLSL ES 1.0(OpenGL ES 2.0), even when the shader target is OpenGL ES 3.
  • #pragma editor_sync_compilation - Force synchronous compilation (affects Editor only).

Каждый фрагмент кода шейдера должен содержать как минимум одну программу для вершинного шейдера и одну программу дла фрагментного шейдера. Поэтому директивы #pragma vertex и #pragma fragment являются обязательными.

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 only supports #pragma directives in the shader files, and not in the includes.

Rendering platforms

Unity supports several rendering APIs (e.g. Direct3D 11 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. Supported renderer names are:

  • 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 feature level, as commonly used on WSA platforms
  • xboxone - Xbox One
  • ps4 - PlayStation 4
  • n3ds - Nintendo 3DS
  • wiiu - Nintendo Wii U

For example, this line would only compile shader into D3D11 mode:

#pragma only_renderers d3d11

См. также


  • 2018–03–20 Page amended
  • Shader #pragma directives added in Unity 2018.1
Поверхностные шейдеры с использованием тесселяции DX11
Примеры вершинных и фрагментных шейдеров