|
05.10.2010, 21:34
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Шейдеры в Unity
Шейдеры в Unity пишутся на специальном языке, который называется ShaderLab. Язык этот не сложный и в этой статье я его попытаюсь описать.
Конечно большая часть этого урока – содержание справки Unity, но так как у многих проблемы с английским – этот урок будет полезным.
Синтаксис шейдера на языке ShaderLab
// Блок Shader – коневой блок // он является контейнером для описания шейдера // через пробел в кавычках указывается имя шейдера Shader "Имя_шейдера" {
// Блок параметров, которые пользователь может визуально // настраивать в инспекторе, при выборе данного шейдера // для материала. Все параметры, описанные в блоке Properties // в остальных местах шейдера должны применяться // в квадратных скобках. Properties { // Список параметров // например, следующая строка описывает параметр _Color // отображаемый в инспекторе как "Main Color" типа // Color с начальным значением (1,.5,.5,1): _Color ("Main Color", Color) = (1,.5,.5,1)
// Unity не поддерживает отображение типа Matrix4x4 // но не смотря на это его можно передавать в шейдер // программным путем. // _SpecColor ("Spec Color", Color) = (1,1,1,1) _Emission ("Emmisive Color", Color) = (0,0,0,0) _Shininess ("Shininess", Range (0.01, 1)) = 0.7 _MainTex ("Base (RGB)", 2D) = "white" {} }
// SubShader – контейнер, определяющий технику // визуализации материала. // Блоков SubShader может быть много, Unity выбирает // первый подходящий шейдер для видеокарты пользователя SubShader {
// Pass – блок, описывающий один проход визуализации // для сложных материалов таких проходов может быть несколько Pass {
// Блок Material назначает параметры материала, // которые будут использованы при расчете освещения. // например, в данном примере устанавливаются все // параметры, необходимые для полноценного вершинного // освещения. Material { Diffuse [_Color] Ambient [_Color] Shininess [_Shininess] Specular [_SpecColor] Emission [_Emission] }
// Директива Lighting On|Off определяет // использование освещения. // Для того чтобы установленные значения блока // Material имели силу – освещение должно быть включено Lighting On
// Директива SeparateSpecular определяет, стоит ли // добавлять зеркальную (бликовую) составляющую в // конце прохода. Чтобы директива имела силу – // освещения должно быть включено (Lighting On) SeparateSpecular On
// дополнительные директивы будут описвны ниже
// Блок SetTexture устанавливает текстуру и метод // ее наложения. После названия блока SetTexture // в квадратных скобках передается имя параметра, // указанного в блоке Properties. // Внутри блока может присутствовать от одной // до трех команд (Combine, Matrix и ConstantColor). // Количество текстурных слотов у разных видеокарт // разное, так что количество блоков SetTexture // должно выбираться в зависимости от того, какие // видеокарты Вы хотите поддерживать. Например, // видеокарты NVIDIA TNT2, GeForce 256, GeForce 2, // GeForce 4MX имеют 2 текстурных блока, а такие как // ATI Radeon 9500 и выше – 4 для D3D и 6-8 для OpenGL SetTexture [_MainTex] {
// Возможности команды Combine можно посмотреть // в справке, замечу, что расчет альфы и цвета // можно разделить. Формулы комбинации цветов // записываются в это случае через запятую. Combine texture * primary DOUBLE, texture * primary } } }
// Директива Fallback определяет то, как поведет себя Unity, // если ни одна из техник, определенных в блоках SubShader // не поддерживается видеокартой. // Имеется две формы записи директивы: // Fallback Off – отключает любые предупреждения о том, что // ни один из SubShader не поддерживается // Fallback "имя_шейдера" – передает все параметры (Properties) // и управление другому шейдеру. Fallback "Имя_другого_шейдера" }
Файл шейдера должен иметь кодировку 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</strong> AmbientAndDiffuse | Emission
Использует цвета вершин для расчета освещения.
Шейдерные программы
Так же существует возможность применять шейдерные программы, написанные на языке Cg для сложных материалов, в которых необходимы специфические расчеты. Для этого вместо или внутри блока Pass необходимо использовать блок CGPROGRAM
CGPROGRAM // директивы компиляции: #pragma vertex vert #pragma fragment frag
// Cg код
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 можно изучить читая справку
UPD: Так же хорошей практикой будет разбор встроенных шейдеров юнити
Последний раз редактировалось pax, 05.10.2010 в 23:28.
|
(Offline)
|
|
Эти 11 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
ARA (05.10.2010), den (05.10.2010), Dr.Evil (06.10.2010), h1dd3n (05.10.2010), Harter (06.08.2012), Illidan (05.10.2010), impersonalis (05.10.2010), Nerd (15.08.2012), Nuprahtor (05.10.2010), pepel (17.01.2011), Zer0n (02.12.2010)
|
05.10.2010, 22:37
|
#2
|
Бывалый
Регистрация: 04.01.2008
Адрес: Казахстан \ Талдыкорган
Сообщений: 659
Написано 170 полезных сообщений (для 509 пользователей)
|
Ответ: Шейдеры в Unity
Это шейдеры ??? чорт не верю! Это описание материалов!!!
Скажете сударь! Но они будут в итоге шейдерами - да ? А я вас прошу и на айподе второй генерации ????
__________________
Жизнь как говориться игра- делать игры моя профессия(с)
Программирование, это религия! Её нужно исповедовать.
|
(Offline)
|
|
05.10.2010, 22:46
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Шейдеры в Unity
Сообщение от FDsagizi
Это шейдеры ??? чорт не верю! Это описание материалов!!!
Скажете сударь! Но они будут в итоге шейдерами - да ? А я вас прошу и на айподе второй генерации ????
|
Называю так, как это называет разработчик Unity
Shaders in Unity are written in a language called ShaderLab, which is similar to Microsoft's .FX files or NVIDIA's CgFX. Vertex & pixel shaders for the GPU are written in standard Cg/HLSL programming language. If you want to write your own shaders, including custom vertex & fragment programs, this section and the ShaderLab reference will explain how. So there are three components to writing shaders in Unity:
|
То что я не привел примеров - извиняюсь.
Вот диффузный шейдер, стандартный в юнити с использованием сурфейсоной системы:
Shader "Diffuse" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 200
CGPROGRAM #pragma surface surf Lambert
sampler2D _MainTex; float4 _Color;
struct Input { float2 uv_MainTex; };
void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG }
Fallback "VertexLit" }
Данный шейдер компилируется для всех платформ включая XBOX 360, PS3 и OpenGL ES 2 для поддержки на iPhone и Android.
Хоть бы дочитал до конца
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.10.2010, 22:53
|
#4
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Шейдеры в Unity
Сообщение от FDsagizi
Это шейдеры ??? чорт не верю! Это описание материалов!!!
|
да, это шейдеры. вернее это компилируется в шейдеры.
если скачать исходники шейдеров с офф.сайта (тут http://unity3d.com/download_unity/builtin_shaders.zip) можно увидеть, что есть вставки на Cg. Т.е. шейдерлаб это надстройка над Cg.
Сообщение от FDsagizi
Скажете сударь! Но они будут в итоге шейдерами - да ?
|
будут. в Unity 3 также отказались от FFP, теперь fixed function pipeline эмулируется шейдерами.
Сообщение от FDsagizi
А я вас прошу и на айподе второй генерации ????
|
на старых айфонах материалы конечно послабее. опять же если посмотреть на встроенные шейдеры, то для каждого там по три-четыре фоллбэка под старые видеокарты, DX9, DX8, DX7, DX6, причем на даже с vendor-specific хаками. Работа, по шейдерам, безусловно, проделана большая.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо ffinder за это полезное сообщение:
|
ARA (05.10.2010), pax (05.10.2010)
|
05.10.2010, 23:39
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Шейдеры в Unity
Во сейчас в справке прочитал про интересный специальный проход - GrabPass.
Выполняя его Unity читает в текстуру ту область, в которую должен быть выведен объект и эту текстуру можно использовать в следующем проходе.
Ссылка
Пример из справки - сложный пример шейдера, который ничего не выводит :
Shader "ComplexInvisible" { SubShader { // Отрисовка после непрозрачной геометрии Tags { "Queue" = "Transparent" }
// Захват экрана в _GrabTexture, используя настройки по умолчанию GrabPass { }
// Отрисовка объекта с текстурой, полученной выше. Pass { SetTexture [_GrabTexture] { combine texture } } } }
Надо будет попробовать эффекты искажения сделать с его помощью.
|
(Offline)
|
|
16.08.2012, 21:04
|
#6
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Шейдеры в Unity
Поссоны, поясните как юзать LOD. Из справки не очень понял.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
16.08.2012, 22:22
|
#7
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Шейдеры в Unity
Тут же все написано
Можешь устанавливать кодом максимальный лод и Unity автоматом сделает фолбэк до нужного шейдера/субшейдера
Последний раз редактировалось pax, 17.08.2012 в 00:13.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:44.
|