Шейдеры в 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 можно изучить читая справку
Так же хорошей практикой будет разбор встроенных шейдеров юнити
6 комментариев на «Шейдеры Unity»
Ваш отзыв
Вы должны войти, чтобы оставлять комментарии.
07 Окт 2011 в 16:15
push@ywrns6.wheat” rel=”nofollow”>.…
сэнкс за инфу …
09 Дек 2011 в 18:50
…
спасибо за инфу …
11 Дек 2011 в 11:17
…
спасибо за инфу …
23 Дек 2013 в 2:40
toe@arco.louder” rel=”nofollow”>.…
спс!…
23 Авг 2014 в 12:48
habitable@gratingly.combe” rel=”nofollow”>.…
спасибо!…
24 Авг 2014 в 8:00
accumulates@raiders.kader” rel=”nofollow”>.…
сэнкс за инфу….