Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 05.10.2010, 21:34   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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.011)) = 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 DOUBLEtexture 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: Так же хорошей практикой будет разбор встроенных шейдеров юнити
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось 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
FDsagizi
Бывалый
 
Аватар для FDsagizi
 
Регистрация: 04.01.2008
Адрес: Казахстан \ Талдыкорган
Сообщений: 659
Написано 170 полезных сообщений
(для 509 пользователей)
Ответ: Шейдеры в Unity

Это шейдеры ??? чорт не верю! Это описание материалов!!!
Скажете сударь! Но они будут в итоге шейдерами - да ? А я вас прошу и на айподе второй генерации ????
__________________
Жизнь как говориться игра- делать игры моя профессия(с)

Программирование, это религия! Её нужно исповедовать.
(Offline)
 
Ответить с цитированием
Старый 05.10.2010, 22:46   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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 INinout SurfaceOutput o) {
    
half4 c tex2D(_MainTexIN.uv_MainTex) * _Color;
    
o.Albedo c.rgb;
    
o.Alpha c.a;
}
ENDCG
}

Fallback "VertexLit"

Данный шейдер компилируется для всех платформ включая XBOX 360, PS3 и OpenGL ES 2 для поддержки на iPhone и Android.

Хоть бы дочитал до конца
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ARA (05.10.2010)
Старый 05.10.2010, 22:53   #4
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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 }
        }
    }

Надо будет попробовать эффекты искажения сделать с его помощью.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 16.08.2012, 21:04   #6
Nerd
Чудо-кот
 
Аватар для Nerd
 
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений
(для 1,471 пользователей)
Ответ: Шейдеры в Unity

Поссоны, поясните как юзать LOD. Из справки не очень понял.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ARA (16.08.2012)
Старый 16.08.2012, 22:22   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Шейдеры в Unity

Тут же все написано

Можешь устанавливать кодом максимальный лод и Unity автоматом сделает фолбэк до нужного шейдера/субшейдера
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 17.08.2012 в 00:13.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nerd (16.08.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 10:21.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com