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 program snippets are written between CGPROGRAM and ENDCG keywords, or alternatively between HLSPROGRAM and ENDHLSL. The latter form does not automatically include HLSLSupport and UnityShaderVariables built-in header files.
В начале программы шейдера могут быть заданы директивы компиляции #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. Supported renderer names are:
For example, this line would only compile shader into D3D9 mode:
#pragma only_renderers d3d9
См. также