Шейдеры в Unity пишутся на специальном языке, который называется ShaderLab. Язык этот не сложный и в этой статье я его попытаюсь описать.
Конечно большая часть этого урока – содержание справки Unity, но так как у многих проблемы с английским – этот урок будет полезным.

Синтаксис шейдера на языке ShaderLab.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<br />
// Блок Shader – коневой блок<br />
// он является контейнером для описания шейдера<br />
// через пробел в кавычках указывается имя шейдера<br />
Shader "Имя_шейдера" {</p>
<p>    // Блок параметров, которые пользователь может визуально<br />
    // настраивать в инспекторе, при выборе данного шейдера<br />
    // для материала. Все параметры, описанные в блоке Properties<br />
    // в остальных местах шейдера должны применяться<br />
    // в квадратных скобках.<br />
    Properties {<br />
       // Список параметров<br />
       // например, следующая строка описывает параметр _Color<br />
       // отображаемый в инспекторе как "Main Color" типа<br />
       // Color с начальным значением (1,.5,.5,1):<br />
        _Color ("Main Color", Color) = (1,.5,.5,1)</p>
<p>       // Unity не поддерживает отображение типа Matrix4x4<br />
       // но не смотря на это его можно передавать в шейдер<br />
       // программным путем.<br />
       //<br />
        _SpecColor ("Spec Color", Color) = (1,1,1,1)<br />
        _Emission ("Emmisive Color", Color) = (0,0,0,0)<br />
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7<br />
        _MainTex ("Base (RGB)", 2D) = "white" {}<br />
    }</p>
<p>    // SubShader – контейнер, определяющий технику<br />
    // визуализации материала.<br />
    // Блоков SubShader может быть много, Unity выбирает<br />
    // первый подходящий шейдер для видеокарты пользователя<br />
    SubShader {</p>
<p>        // Pass – блок, описывающий один проход визуализации<br />
        // для сложных материалов таких проходов может быть несколько<br />
        Pass {</p>
<p>            // Блок Material назначает параметры материала,<br />
            // которые будут использованы при расчете освещения.<br />
            // например, в данном примере устанавливаются все<br />
            // параметры, необходимые для полноценного вершинного<br />
            // освещения.<br />
            Material {<br />
                Diffuse [_Color]<br />
                Ambient [_Color]<br />
                Shininess [_Shininess]<br />
                Specular [_SpecColor]<br />
                Emission [_Emission]<br />
            }</p>
<p>            // Директива Lighting On|Off определяет<br />
            // использование освещения.<br />
            // Для того чтобы установленные значения блока<br />
            // Material имели силу – освещение должно быть включено<br />
            Lighting On</p>
<p>            // Директива SeparateSpecular определяет, стоит ли<br />
            // добавлять зеркальную (бликовую) составляющую в<br />
            // конце прохода. Чтобы директива имела силу –<br />
            // освещения должно быть включено (Lighting On)<br />
            SeparateSpecular On</p>
<p>            // дополнительные директивы будут описвны ниже</p>
<p>            // Блок SetTexture устанавливает текстуру и метод<br />
            // ее наложения. После названия блока SetTexture<br />
            // в квадратных скобках передается имя параметра,<br />
            // указанного в блоке Properties.<br />
            // Внутри блока может присутствовать от одной<br />
            // до трех команд (Combine, Matrix и ConstantColor).<br />
            // Количество текстурных слотов у разных видеокарт<br />
            // разное, так что количество блоков SetTexture<br />
            // должно выбираться в зависимости от того, какие<br />
            // видеокарты Вы хотите поддерживать. Например,<br />
            // видеокарты NVIDIA TNT2, GeForce 256, GeForce 2,<br />
            // GeForce 4MX имеют 2 текстурных блока, а такие как<br />
            // ATI Radeon 9500 и выше – 4 для D3D и 6-8 для OpenGL<br />
            SetTexture [_MainTex] {</p>
<p>                // Возможности команды Combine можно посмотреть<br />
                // в справке, замечу, что расчет альфы и цвета<br />
                // можно разделить. Формулы комбинации цветов<br />
                // записываются в это случае через запятую.<br />
                Combine texture * primary DOUBLE, texture * primary<br />
            }<br />
        }<br />
    }</p>
<p>    // Директива Fallback определяет то, как поведет себя Unity,<br />
    // если ни одна из техник, определенных в блоках SubShader<br />
    // не поддерживается видеокартой.<br />
    // Имеется две формы записи директивы:<br />
    // Fallback Off – отключает любые предупреждения о том, что<br />
    // ни один из SubShader не поддерживается<br />
    // Fallback "имя_шейдера" – передает все параметры (Properties)<br />
    // и управление другому шейдеру.<br />
    Fallback "Имя_другого_шейдера"<br />
}<br />

Файл шейдера должен иметь кодировку ASCII.

Приведенный в качестве описания синтаксиса шейдер является аналогом материала, используемого в Blitz3d.

Как и обещал, привожу список основных директив блока Pass:

  • Cull Back | Front | Off
    Устанавливает тип куллинга полигонов.
  • ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always)
    Устанавливает режим теста глубины.
  • ZWrite On | Off
    Устанавливает режим записи глубины.
  • Fog { блок описания тумана }
    Устанавливает параметры тумана.
  • AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
    Включает альфатест.
  • Blend SourceBlendMode DestBlendMode
    Устанавливает режим альфасмешивания.
  • Color Color value
    Устанавливает цвет, если вершинное освещение отключено.
  • ColorMask RGB | A | 0 | любая комбинация R, G, B, A
    Маска записи цвета. ColorMask 0 выключает рендеринг для всех цветовых каналов.
  • Offset OffsetFactor , OffsetUnits
    Устанавливает офсет (смещение) глубины.
  • ColorMaterial AmbientAndDiffuse | Emission
    Использует цвета вершин для расчета освещения.

Шейдерные программы

Так же существует возможность применять шейдерные программы, написанные на языке Cg для сложных материалов, в которых необходимы специфические расчеты. Для этого в блоке Pass необходимо использовать блок CGPROGRAM

1
2
3
4
5
6
CGPROGRAM<br />
// директивы компиляции:<br />
#pragma vertex vert<br />
#pragma fragment frag</p>
<p>// Cg код</p>
<p>ENDCG

#pragma vertex и #pragma fragment определяют соответственно вершинную и фрагментную функции. Существует так же #pragma target, значениями которой могут быть default и 3.0. В первом случае для компиляции используются vs 1.1 и ps 2.0, во втором – vs 3.0 и ps 3.0. При компиляции для 3.0 – обе директивы #pragma vertex и #pragma fragment должны присутствовать.

Подробнее об этом ShaderPrograms

В Unity 3 появились новые возможности для реализации шейдеров – Surface Shaders. Используя эти возможности можно облегчить себе жизнь при написании шейдеров на языке Cg. Подробнее – SurfaceShaders

Конечно же я не могу охватить все возможности языка ShaderLab, надеюсь и этого хватит, чтобы понять его структуру и двигаться дальше. Удачи!

Более углублено ShaderLab можно изучить читая справку ;)

Так же хорошей практикой будет разбор встроенных шейдеров юнити

VN:F [1.9.3_1094]
Rating: 9.1/10 (18 votes cast)
VN:F [1.9.3_1094]
Rating: +8 (from 10 votes)
Шейдеры Unity, 9.1 out of 10 based on 18 ratings

6 комментариев на «Шейдеры Unity»

  1. rafael

    push@ywrns6.wheat” rel=”nofollow”>.

    сэнкс за инфу :x

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  2. nicholas

    1
    <strong><a title="http://realize.buildspot.ru/?p=7302" href="http://realize.buildspot.ru/?p=7302" rel="nofollow">:twisted:</a></strong>

    спасибо за инфу :razz:

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  3. billy

    :lol:

    спасибо за инфу :?:

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  4. roland

    toe@arco.louder” rel=”nofollow”>.…

    спс!…

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  5. Johnny

    habitable@gratingly.combe” rel=”nofollow”>.…

    спасибо!…

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)
  6. marion

    accumulates@raiders.kader” rel=”nofollow”>.…

    сэнкс за инфу….

    VA:F [1.9.3_1094]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.3_1094]
    Rating: 0 (from 0 votes)

Ваш отзыв

Вы должны войти, чтобы оставлять комментарии.



Страница 1 of 0