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 и #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 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:
For example, this line would only compile shader into D3D9 mode:
#pragma only_renderers d3d9