Version: 5.3 (switch to 5.4b)
Поверхностные шейдеры с использованием тесселяции DX11
Примеры вершинных и фрагментных шейдеров

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

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

Если вы хотите писать шейдеры которые взаимодействуют с освещением, взгляните на документацию по Поверхностным Шейдерам. Примеры вершинных и фрагментных шейдеров. Далее предполагается что шейдеры не взаимодействуют с освещением Unity (напр. со спецэффектами, Image Effects etc.)

Шейдерные программы пишутся на языке 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 пишутся между ключевыми словами CGPROGRAM и ENDCG.

В начале программы шейдера могут быть заданы директивы компиляции #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 only_renderers имена рендереров через пробел - Компилировать шейдер только для указанных рендереров. По умолчанию шейдер компилируется для всех рендереров. Подробнее см. Renderers ниже.
  • #pragma exclude_renderers имена рендереров через пробел - не компилировать шейдер для указанных рендереров. По умолчанию шейдер компилируется для всех рендереров. Подробнее см. Renderers ниже.
  • #pragma multi_compile …_ - для работы с разными вариантами шейдера.
  • #pragma enable_d3d11_debug_symbols - генерировать отладочную информацию для шейдеров скомпилированных под DirectX 11, это позволит вам отлаживать шейдеры с помощью отладчика графики в Visual Studio 2012 (или выше).

Каждый фрагмент кода шейдера должен содержать как минимум одну программу для вершинного шейдера и одну программу дла фрагментного шейдера. Поэтому директивы #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.

Rendering platforms

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.
  • #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.
  • #pragma target 3.0 - компилировать под шейдерную модель версии 3.0:
  • n3ds - Nintendo 3DS.
  • wiiu - Nintendo Wii U.

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

#pragma only_renderers d3d9

Смотрите так же

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