Unity чем открыть shader

Обновлено: 06.07.2024

Главная » Unity: Введение в шейдеры

Unity: Введение в шейдеры

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

Unity оказывает большую помощь разработчикам игр, в том числе предлагает шейдеры, чтобы упростить создание сложных визуальных эффектов и анимации. Вы можете продвинуться довольно далеко, просто разбираясь со стандартными шейдерами, которые поставляются с Unity. Однако вы можете улучшить визуальные эффекты в своих проектах, написав собственные шейдеры.

В этом руководстве вы узнаете:

  • Что такое шейдеры.
  • Как отображать цвета вершин.
  • Как анимировать в шейдерах.

В примере проекта используется Unity 2019.3, хотя все, что описано в этом руководстве, должно работать и в более старых версиях.

Примечание. Это урок среднего уровня сложности, предполагающий, что вы уже знаете основы работы с Unity. Если вы новичок в Unity, начните с урока Введение в Unity: начало работы.

Что такое шейдеры?

Компьютерная графика, особенно 3D-графика, использует множество различных видов информации для построения визуальных элементов: сетки, текстуры, источники света и так далее. Эта информация передается графическому оборудованию, которое затем обрабатывает изображение и выводит его на экран.

Как компьютеры визуализируют графику

Понимание типов шейдеров

Технически, отдельный шейдер не выводит изображение целиком и не всегда выполняет рендеринг. Скорее, существуют разные типы шейдеров, которые делают разные вещи.

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

Есть также вершинные шейдеры, которые вы используете для вычисления положения вершин на изображении. Хотя входные данные представлены в трех измерениях, компьютеру необходимо определить, где появляются вершины в двух измерениях, прежде чем он сможет отобразить пиксели.

Вы можете добиться некоторых интересных визуальных эффектов, манипулируя данными, выводимыми с помощью вершинных шейдеров, но мы не будем рассматривать это в уроке.

Поверхностные шейдеры на самом деле являются фрагментными и вершинными шейдерами, но Unity генерирует код для обработки освещения. Это удобно, поскольку расчеты освещения очень сложны и часто стандартизируются для множества различных шейдеров.

И наконец, графические данные сообщают видеокарте, какой шейдер использовать с материалами. Когда вы будете изучать материалы, вы увидите меню вверху. Это меню выбирает, какой шейдер назначить материалу. Таким образом, когда графическое оборудование визуализирует многоугольник, оно запускает шейдер материала этого многоугольника.

Выбор из меню Shader окна Inspector в Unity

Хорошо, достаточно объяснений. Пришло время написать шейдеры!

Написание пользовательского шейдера

Если вы еще этого не сделали, откройте начальный проект, затем откройте RW / Scenes / SampleScene. Вы увидите заранее построенную сцену необитаемого острова с позиционированными моделями, которым назначены материалы.

Сцена песчанного острова в начале создания шейдеров в Unity

Существующая сцена не выглядит ужасной, но вы можете улучшить ее, по крайней мере, двумя способами: остров имеет твердые квадратные края, а вода полностью статична.

Вы можете решить обе проблемы с помощью пользовательских шейдеров. Однако, прежде чем решать эти проблемы, вам необходимо понять, как создавать шейдеры.

Для начала создайте ассет Surface Shader в папке Shaders, щелкнув правой кнопкой мыши и выбрав Create > Shader > Standard Surface Shader. Назовите его MyFirstShader.

Перейдите в папку Materials, выберите cartoon-sand и щелкните раскрывающийся список Shader в верхней части Inspector. Выберите Custom > MyFirstShader, чтобы переключить материал на этот шейдер.

Выбор MyFirstShader в качестве шейдера для песчанного материала в Unity

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

Рассмотрение шаблона по умолчанию для настраиваемого шейдера

Дважды нажмите на ассет Shader, чтобы открыть его в редакторе кода, и изучите код.

Шейдер состоит из различных разделов внутри основного блока кода шейдера.

Properties

В блоке Properties вверху вы объявляете различные определяемые пользователем свойства. Это значения, которые вы можете редактировать в инспекторе при выборе материала.

Подробное рассмотрение одной строки: сначала вы видите имя переменной, используемое в коде. Затем в круглых скобках вы определяете имя, которое будет отображаться в инспекторе. Также в круглых скобках указывается тип свойства: цвет, двухмерная текстура или диапазон чисел. Наконец, после знака = вы присваиваете свойству значение по умолчанию.

Блок SubShader

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

Блок CGPROGRAM

Эти строчки кода декларируют несколько важных аспектов, которым нужно следовать. Во-первых, они указывают, что следующий код использует язык Cg. Для написания шейдеров существует несколько разных языков программирования. До этого момента все использовалось на языке Unity, ShaderLab.

Переменная свойства MainTex

Эта строчка объявляет переменную, соответствующую одному из свойств. Хотя это кажется немного избыточным, вы должны объявить здесь переменную, чтобы код Cg использовал это свойство.

Эти переменные могут быть одного из нескольких типов, включая sampler2D для изображения текстуры и fixed / half / float для чисел. Эти три числа являются числами возрастающей точности, и вы должны использовать наименьшую точность, которая работает.

Числовые значения могут иметь номер суффикса для создания вектора. Например, fixed4 обозначает четыре числа. Вы получаете доступ к значениям в векторе с помощью свойств .xyzw или .rgba.

Например, c.rgb в коде шейдера извлекает первые три числа из fixed4 , вызываемого c .

Вы должны объявить все свойства как переменные в коде Cg. Вы можете увидеть другие имена свойств чуть позже в уроке. Почему в коде шаблона Unity они написаны отдельно друг от друга, а не в один единый список, остается загадкой, но это также не имеет особого значения.

Вводные данные и переменные свойства

Этот блок кода объявляет структуру данных с именем Input и перечисляет в ней значения. Единственными входными значениями в коде шаблона являются UV-координаты основной текстуры, но есть несколько входных значений, к которым шейдеры могут получить доступ. Графические данные передадут объявленные здесь входные значения в шейдер.

Главная функция шейдера

Вы заметите, что структура вывода имеет такие параметры, как .Metallic и .Smoothness , которые вы устанавливаете с помощью свойств шейдера.

Unity предоставляет tex2D для поиска цвета в текстуре по заданной координате. При написании фрагментного шейдера необходимо явно включить библиотеку шейдеров Unity, но шейдеры поверхности включают библиотеку автоматически.

FallBack шейдер

После кода Cg вы объявляете резервный шейдер, хотя он и не требуется. Это указывает Unity использовать резервный шейдер, если графическое оборудование не может запускать какие-либо пользовательские субшейдеры, обычно потому, что это старая видеокарта, которая не поддерживает функции шейдера.

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

Добавление цвета вершин в шейдер поверхности

Сейчас вы можете довольно четко видеть края сетки, но кажется, что настоящие пляжи переходят в цвет воды.

Есть много способов добиться этого в игре, но в одном простом подходе используется цвет вершин.

Например, если вы присвоите вершине красный цвет, то многоугольник, использующий эту вершину, будет иметь красный оттенок. Более того, если вершины многоугольника имеют разные цвета, то эти цвета интерполируются по граням многоугольника.

Цвета, интерполированные на грань треугольника

Этому островному мешу уже назначены цвета вершин, но вы не можете их видеть, потому что стандартный шейдер Unity не обрабатывает цвета вершин.

Создание пользовательского шейдера для цвета вершин

Создайте новый шейдер поверхности и назовите его LitVertexColor. Установите материалу cartoon-sand этот шейдер как используемый, а затем откройте ресурс шейдера, чтобы отредактировать код.

Вам нужно всего лишь сделать два небольших дополнения для цвета вершины. Сначала добавьте в структуру Input следующий код:

Далее включите vcolor в расчет цвета, который происходит в surf :

И это все! Сохраните шейдер и вернитесь в сцену Unity. После компиляции шейдера вы увидите, как края острова сливаются под водой.

Сцена песчанного острова со смешанными краями

Анимация текстуры воды

Теперь песок выглядит намного привлекательнее! Между тем, вы обнаружили еще одну проблему, заключающуюся в том, что вода полностью статична.

Вы можете изменить это с помощью другого настраиваемого шейдера, хотя на этот раз вам не нужно освещение. Помните, что поверхностные шейдеры обрабатывают освещение за вас, поэтому на этот раз вы не будете создавать поверхностные шейдеры.

Создание неосвещенного шейдера

Вместо этого создайте Unlit Shader с помощью контекстного меню: Create > Shader > Unlit Shader.

Назовите новый ассет шейдер CartoonWater и откройте его в редакторе кода.

Первым делом обновите имя шейдера в самом верху.

Затем добавьте некоторые дополнительные свойства для шейдера воды. Новый блок Properties должен выглядеть так:

По умолчанию Unlit Shader имеет только одно свойство текстуры _MainTex , поэтому вы добавили дополнительные свойства для управления как непрозрачностью воды, так и тем, как анимируется текстура поверхности.

Затем обновите раздел Tags и сразу после строки LOD 100 добавьте несколько новых параметров:

Теги по умолчанию предполагают непрозрачный материал, поэтому вы добавили и настроили некоторые флаги для поддержки прозрачности. В частности, обратите внимание, что отключение ZWrite означает, что вода не будет закрывать другие объекты в буфере глубины, в то время как вы устанавливаете Blend для использования альфа-значений.

Теперь обратите внимание на раздел CGPROGRAM с его набором директив pragma .

Поверхностные шейдеры получают эти библиотеки автоматически, когда вы генерируете их код, но вам необходимо явно включить их для вершинных и фрагментных шейдеров.

unity варит полезные инструменты шейдеров

UnityCG.cginc include в Unity содержит предопределенные переменные и вспомогательные функции.

Теперь взгляните на включенные структуры:

На этот раз есть две входные структуры вместо одной входной структуры для поверхностного шейдера. Вы вводите первую структуру в вершинный шейдер, который выводит вторую структуру. Эти выходные данные вершинного шейдера затем поступают на вход фрагментного шейдера.

Чуть ниже sampler2D _MainTex; В строке основного кода Cg добавьте следующие новые свойства:

Как и в предыдущем Surface Shader, вы должны объявить все свойства как переменные в Cg-коде. Вы будете использовать эти свойства, чтобы изменить текстуру и анимировать ее в основной функции шейдера.

Теперь в основной функции фрагмента шейдера, прямо вверху (над комментарием кода // sample the texture добавьте:

В результате получается волнообразная анимация текстуры. Между тем, обе строки кода делают по сути одно и то же, но в разных направлениях. Вы поймете и то, и другое, если подробно разберете одну строку.

Затем вы добавляете время к переданному числу, заставляя возвращаемое значение перемещаться по синусоиде с течением времени. Код библиотеки из более раннего включает переменную, которая отслеживает время.

Наконец, вы умножаете все на _AnimScale , свойство, которое контролирует, насколько сильным будет эффект. Чем больше масштаб, тем больше волнистость.

Наконец, чуть выше return col; в строке кода функции frag добавьте:

Здесь код просто устанавливает альфа-значение для свойства _Opacity . Обязательно сделайте это после выборки текстуры; в противном случае текстура перезапишет альфа-значение.

Теперь, когда вы написали свой шейдер, вы можете назначить его материалу cartoon-water.

По умолчанию поверхность воды не будет анимирована в режиме просмотра Scene, но будет отображаться в режиме просмотра Game, когда вы нажмете Play.

Куда двигаться дальше?

Помните ту удобную функцию шейдера, которую вы использовали ранее? Что ж, если вам интересно, какие вспомогательные функции доступны с этим включением, вы можете проверить их здесь.

Если вам интересно узнать о шейдерах с помощью Unity, ознакомьтесь с нашим другим руководством по Shader Graph в Unity здесь.

Надеюсь, вам понравился этот урок! Если у вас есть какие-либо вопросы, комментарии или предложения, не стесняйтесь оставлять их в комментариях.

Шейдеры в Unity: введение в тему от Cyanilux

Привет! Это небольшое введение в тему шейдеров, что это такое и как они используются при рендере графики в Unity.

Что такое меш?

Прежде чем перейти конкретно к шейдерам, важно сначала получить базовое представление о том, что такое меш.

Меш содержит данные для 3D-модели, состоящие из вершин и того, как те соединяются в треугольники. Каждый треугольник состоит из 3 вершин, но каждая вершина может быть общей для нескольких треугольников (поэтому количество вершин не всегда будет втрое больше, чем треугольников).

Даже такая, казалось бы, простая фигура, как куб, должна быть разбита на треугольники.

Пример кубического меша, состоящего из 12 треугольников. В Blender (ПО для 3D-моделирования) это 8 вершин, однако при импорте в Unity цифра может измениться в зависимости от того, являются ли данные для каждой вершины одинаковыми у общих вершин.

Термины «меш» и «модель» обычно используются как взаимозаменяемые. Но если углубиться в детали, «меш» всегда относится к геометрии (вершины/треугольники), а «модель» может относиться к импортированному файлу, в котором иногда содержатся несколько объектов меша, сабмеши, а также материалы, анимация и т.д.

Когда мы говорим «вершина», мы обычно имеем в виду ее положение в трехмерном пространстве, но каждая вершина в меше может содержать множество фрагментов данных. Сюда входят такие данные, как:

  • Положение в 3D пространстве (пространстве объектов, поэтому (0,0,0) стоит в начале меша).
  • UV, также известные как Текстурные Координаты, поскольку они чаще всего используются для наложения текстуры на модель. Обычно бывают координаты Vector2 (два значения с плавающей точкой, каждая ось помечена как xy или uv), но настоящие UV каналы могут быть Vector4 и содержать для передачи данных до 4 чисел с плавающей точкой. Смотрите Mesh.SetUVs.
  • Нормали (Направления, используемые для шейдинга. Некоторые программы моделирования (например, Blender) могут дополнительно использовать для определения порядка поворота вершин, который показывает в какую сторону смотрит грань. Во время рендеринга в шейдере можно отбросить переднюю или заднюю сторону грани).
  • Касательные (Направления перпендикулярные нормалям, которые огибают поверхность сетки вдоль горизонтальных координат текстуры (uv.x). Используются для построения Пространства Касательных, которое необходимо в таких разновидностях шейдинга как Normal/Bump Mapping)
  • Цвета вершин (Цвет, который задан каждой вершине).

Две вершины могут занимать одинаковое положение в 3D пространстве, но если не совпадают другие относящиеся к ним данные, в вершинных данных для них будет две отдельных записи.

Шейдеры в Unity обычно пишут так, чтобы было по возможности больше смежных вершин.

Пример кубических мешей. Оба имеют по 12 треугольников, но у левого 24 вершины, а у правого 8.

Достаточно распространено, когда модель имеет равномерное затенение (flat shading), а не плавное (smooth shading) как на изображении выше. Равномерное затенение увеличит количество вершин, потому что нормали вершин у разных граней должны указывать в разных направлениях. (Этого может не случиться в самой программе моделирования, но произойдет при экспорте в Unity). Для плавного затенения используется среднее значение направлений, поэтому вершины можно использовать как общие, при условии, что остальные данные также совпадают!

Что такое шейдер?

Вершинный шейдер запускается для каждой вершины в меше и отвечает за преобразование трехмерных положений вершин (в пространстве объектов) в положения пространства отсечения (Геометрия отсекает невидимые камерой части объектов. Есть несколько дополнительных шагов, чтобы превратить это в положение на 2D экране. Надеюсь, я восполню пробелы в одном из следующих постов). Также он должен передавать из меша данные, которые потребуются для вычислений на этапе фрагментного шейдера (UV, нормали и т.д.).

В таких инструментах, как Shader Graph, все это обычно делается за нас, но важно понимать, что здесь происходит два отдельных этапа. В новых версиях есть Master Stack, чтобы четче разделить эти этапы. Он предоставляет нам порт Vertex Position, чтобы переопределить положение в пространстве объектов, прежде чем оно будет преобразовано в пространство отсечения, например, для Vertex Displacement. Мы также можем переопределить нормали и касательные, которые передаются на этап фрагментного шейдера, но Shader Graph обработает порты автоматически, если оставить поля пустыми.

Для каждого треугольника и вершины в этом треугольнике положения пространства отсечения, переданные из стадии вершин, используются для создания фрагментов — потенциальных пикселей на 2D-экране. Все данные для каждой вершины, переданные во фрагментный шейдер, также интерполируются по треугольнику. Вот почему у каждой вершины может быть указан один цвет, но треугольник получится градиентно окрашенным. (То же самое происходит с UV, что позволяет правильно наложить текстуру, а не просто брать цвет как один пиксель для каждой вершины)

Треугольник с интерполированной раскраской.

Далее для этих фрагментов (потенциальных пикселей) запускается фрагментный шейдер. Он определяет цвет, который будет нарисован на экране (и в некоторых случаях выводит значение глубины). В результате может выводиться сплошной цвет с использованием цветов вершин, сэмплирование текстур и/или более сложный шейдинг с вычислениями освещения (название «шейдер» пошло от слова shade – тень).

В некоторых случаях бывает нужно отменить/отбросить пиксель из рендера (например, по alpha).

Код шейдера

Шейдеры в Unity написаны на HLSL (High Level Shading Language), хотя обычно вы увидите, что его называют CG. Особенно, если имеете дело со встроенным конвейером (Built-in Render Pipeline).

Вы всегда увидите этот шейдерный код между тегами CGPROGRAM / HLSLPROGRAM и ENDCG / ENDHLSL. (А еще можете увидеть CGINCLUDE / HLSLINCLUDE, который включает код в каждый проход шейдера).

Шейдеры для URP / HDRP всегда должны использовать HLSL-версии этих тегов, так как CG-теги включают некоторые дополнительные файлы, которые не нужны этим конвейерам. В противном случае это приведет к ошибке из-за переопределения в библиотеках шейдеров.

Остальная часть файла .shader написана с использованием специфичного для Unity синтаксиса, известного как ShaderLab, и включает такие блоки, как «Shader», «Properties», «SubShader» и «Pass». Документацию по синтаксису Shaderlab вы можете найти здесь.

Технически Shaderlab имеет несколько устаревших способов создания шейдеров с фиксированными функциями, что означает отсутствие в надобности CG/HLSL PROGRAM, но я бы не стал беспокоиться об их изучении, поскольку программирование шейдеров намного полезнее.

В качестве альтернативы существуют редакторы шейдеров на основе нодов, такие как Shader Graph (официальный, доступен для URP или HDRP), Amplify Shader Editor (работает во всех конвейерах, но не бесплатный) и Shader Forge (больше не поддерживается, работает только в старых версиях Unity).

Проходы шейдера

Обычно шейдеры включают основной этап, который либо не имеет тега LightMode, либо использует один из таких тегов как UniversalForward (URP), ForwardBase (Built-in Pipeline) или Forward (HDRP), если шейдер предназначен для использования в прямом, а не в отложенном рендеринге (я немного объясню это в следующем разделе).

Геометрические шейдеры Unity

Ресурсов по шейдерам в Unity вообще достаточно мало. Но есть очень специфичный тип шейдеров, для которых ресурсов мало до странности (по крайней мере, на момент написания) — это геометрические шейдеры.

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

Наиболее очевидный пример — это шейдеры для травы. В некоторых случаях генерация травинок или квадов с текстурой травы может быть лучше, чем создание повсюду травяных объектов. Плюс геометрические шейдеры могут дать больше гибкости, когда речь идет об оптимизации и настройке.

Я привожу здесь ссылки на некоторые тьюториалы и ресурсы, которые помогли мне понять геометрические шейдеры, поэтому определенно рекомендую их в качестве дополнительного материала:

Предисловие

Прежде чем перейти к коду, давайте начнем с обзора того, что такое геометрический шейдер. Чтобы помочь мне проиллюстрировать их роль, представлю упрощенный конвейер рендеринга в реальном времени:

конвейер рендеринга из Vulkan

Это про конвейер в Vulkan, но концепция очень похожа на другие конвейеры. Желтые прямоугольники — это фактические этапы конвейера, которые мы можем запрограммировать / переопределить с помощью шейдеров.

Основной вывод — геометрические шейдеры представляют собой шаг между вершинными и фрагментными, и эту концепцию вы будете замечать в примерах шейдеров. Их основная цель — получать информацию из отдельных вершин через вершинный шейдер, собирать примитивы, которые будут формировать объект (обычно это будут треугольники), и отправлять окончательную информацию на фрагментный шейдер для раскраски, освещения и т.д.

Однако самая крутая вещь в геометрических шейдерах, что когда они берут тройки вершин, образующих (например) треугольник, они могут не только определять, что происходит с этим треугольником, но также генерировать новые вершины и новые треугольники. Затем брать всю эту недавно сгенерированную геометрию и разворачивать ее, как делалось бы при смещении вершин в вершинном шейдере. Это позволяет, например, делать частицы из треугольников, как продемонстрировал VFX Mike.

Наконец, хотя их код поначалу может показаться пугающим, как только вы освоите некоторые вещи, использование шейдеров станет интуитивно понятным. И вы сможете лучше понять такие вещи, как UV и координаты пространства объектов. И, если вы чем-то похожи на меня, вы поймаете себя на том, что говорите: «О, чёрт, я не думал, что это сработает!».

Как писать геометрические шейдеры Unity

Я решил начать с простого геометрического шейдера без дополнительной функциональности, просто чтобы избавиться от писанины. Это также послужит аккуратным шаблоном для геометрических шейдеров, которые вы сами будете делать, поэтому на вашем месте я бы сохранил код где-нибудь неподалеку.

Давайте посмотрим на код:

void geom ( triangle v2g IN [ 3 ] , inout TriangleStream triStream )

ВАЖНО: Чтобы избежать любых неточностей, автор настоятельно рекомендует взять код из github. В частности, его WordPress не хотел правильно печатать «<», поэтому местами получалось «& lt;».

В данном случае мы не просто передаем данные из вершинного во фрагментный шейдер, у нас есть геометрический шейдер между ними. Поэтому нам потребуются три структуры данных вместо обычных двух:

  1. Структура «appdata», чтобы передавать свойства объекта в вершинный шейдер, как обычно.
  2. Структура «v2g», чтобы передавать данные из вершинного шейдера в геометрический.
  3. Структура «g2f», чтобы передавать данные из геометрического шейдера в фрагментный.

Сначала мы видим вершинный шейдер. Вместо объекта v2f теперь он возвращает объект v2g, который, как упоминалось выше, передает данные в геометрический шейдер. В этом простом случае вершина просто передает данные без каких-либо изменений.

В строке 48 я просто передаю позицию вершины в объектном пространстве как она есть, в строке 49 я делаю то же самое для координат UV вершины. Обратите внимание, что я не выполнял преобразование положения объекта в пространство отсечения и не использовал макрос «TRANSFORM_TEX» для UV, поскольку эти действия будут выполняться в геометрическом шейдере при передаче данных в фрагментный шейдер.

Имейте в виду, что на самом деле мы могли бы выполнить преобразование object-to-clip-position и вычисления UV в вершинном шейдере, и это может быть даже лучше, так как это будет сделано меньше раз. Но передача необработанных данных в геометрический шейдер дает нам больше гибкости в том, как мы обрабатываем их.

Геометрический шейдер в шаблоне кода

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

В строке 53 над шейдером есть странный атрибут. Как следует из названия, «maxvertexcount» позволяет шейдеру знать максимальное количество вершин, которое будет добавляться данным геометрическим шейдером. Поскольку мы просто добавляем фактические треугольники объекта, будет выводиться 3 вершины.

Затем в строке 54 есть объявление метода, содержащее несколько странных параметров:

  • triangle v2g IN[3] : Это массив из трех объектов v2g, каждый из которых соответствует одной вершине треугольника, который изучается в текущий момент. Тег «triangle» сообщает геометрическому шейдеру, что он будет ожидать треугольник в качестве входных данных. В качестве входных данных вы можете получить строку (поэтому понадобится массив объектов v2g размером 2) или точку (понадобится массив объектов v2g размера 1).
  • inout TriangleStream<g2f> triStream : Если вы не заметили, то геометрический шейдер возвращает «void», поэтому на самом деле ни одного объекта, как это делал бы вершинный шейдер. Геометрический шейдер на самом деле добавляет каждый треугольник в список TriangleStream, который принимает объекты типа «g2f». Если вы хотите вывести линии, вы превратите их в «inout LineStream <g2f> lineStream», а если вы хотите вывести точки, это будет «inout PointStream <g2f> pointStream».

Теперь давайте перейдем к реальной функциональности. Геометрическому шейдеру нужно просто получить данные из вершинного шейдера и собрать треугольники, которые затем будут преобразованы во фрагменты и закрашены фрагментным шейдером.

Сначала в строке 56 мы создаем объект g2f, который будем использовать для постоянного изменения его полей, а затем добавляем объект в поток.

Затем мы сделаем простой цикл, чтобы добавить три входные вершины в поток и создать треугольник объекта. И поскольку эти данные поступают в фрагментный шейдер, я делаю все модификации, которые хочу, здесь.

Во-первых, в строке 60 я использую прием «UnityObjectToClipPos», чтобы преобразовать позицию входной вершины из объектного пространства в пространство отсечения. Затем макрос «UNITY_TRANSFER_FOG» для передачи всей информации о тумане Unity. В строке 62 я также использую макрос «TRANSFORM_TEX» для изменения UV-координат на основе информации о масштабировании и тайлинге «_MainTex». Все это делается для каждой из трех вершин треугольника так же, как делали бы в вершинном шейдере, если бы у нас не было геометрического.

Наконец, мы добавляем модифицированный объект «g2f» к потоку треугольников, используя «triStream.Append (o);». После цикла в строке 66 также есть прием «RestartStrip». Он должен сообщить потоку, что будет добавлять отдельный треугольник впоследствии. Здесь, поскольку мы не добавляем никаких новых треугольников, это на самом деле не нужно. Я добавил, чтобы вы могли легко скопировать код для последующей доработки.

Фрагментный шейдер в шаблоне

Наконец, в строках 69-76 у нас фрагментный шейдер. Вы можете заметить, что он совершенно не отличается от фрагментного шейдера по умолчанию в новом неосвещенном шейдере, за исключением того, что в качестве параметра он получает «g2f» вместо «v2f».

Выдавливание пирамид

Теперь у нас есть основа для геометрического шейдера, и мы можем создать на ней тот, который что-то делает. В частности, вот этот будет выдавливать пирамиды из каждого треугольника, просто добавляя точку в центре каждого и выдавливая пирамиду в направлении вектора нормали к плоскости.

Shader Graph позволяет вам с легкостью разрабатывать шейдеры в визуальном интерфейсе с отображением результатов в реальном времени. Создавайте и объединяйте узлы в графы вместо написания кода.


Разработка шейдеров в Unity традиционно была вотчиной тех, кто имеет опыт программирования. Shader Graph открывает эту сферу художникам и другим сотрудникам студии, упрощая создание шейдеров. Просто объедините узлы в сеть графов — вы увидите результат изменений сразу же. Средство можно использовать как с High Definition Render Pipeline, так и с Universal Render Pipeline.


Изменения в сети графов отражаются на результате мгновенно. Вам не придется ждать завершения вычислений и запекания результатов. Экспериментировать с шейдерами теперь сможет даже новичок.


Инструменты визуальной разработки позволят вам создавать художественные и другие спецэффекты, например тепловое зрение, снег и средства маскировки.

Система Shader Graph:

  • Предназначена для работы с функцией Scriptable Render Pipeline. Главные узлы, которые работают с Universal Render Pipeline и High Definition Render Pipeline (HDRP), входят в стандартный комплект установки.
  • Поддерживает расширение для работы с любым процессом рендеринга.
  • Позволяет задать собственное поведение узла непосредственно в шейдерном графе или через файлы HLSL.


Теперь вы можете создавать шейдеры в графическом интерфейсе Shader Graph и использовать их в Visual Effect Graph для изменения внешнего вида и методов отрисовки качественных визуальных эффектов.

Модуль Blackboard теперь можно использовать для присвоения ключевых слов шейдерам, создавая таким образом статичные ветки в графе. Это позволяет оптимизировать шейдеры с помощью таких систем, как Shader Level of Detail (LOD).

Стикеры облегчают вам работу, позволяя оставлять комментарии и пояснения для всех, кто трудится над проектом.

В этом выпуске также реализована поддержка привязки скелета к вершинам для анимации на основе DOTS — это возможность создавать более реалистичные эффекты для воды и растений.

Примеры подграфов для процедурно генерируемых текстур представляют собой коллекцию, демонстрирующую возможности математической генерации различных форм и узоров. Это отличное начало для работы с простыми масками, доступными в менеджере пакетов.

Смотрите наши официальные доклады и обучающие материалы по созданию шейдеров


Что нового в Shader Graph: готовность к профессиональному использованию

Узнайте о состоянии Shader Graph. В этой презентации показаны новые возможности и рекомендуемые методы, которые позволят вам с легкостью разрабатывать шейдеры в визуальном интерфейсе с отображением результатов в реальном времени.


Шейдер Distortion в Unity 2019 с помощью Shader Graph! (обучающий материал)

Из этого видео вы научитесь создавать шейдер Distortion с помощью Shader Graph в Unity 2019, узнаете, как сделать работу удобнее, и сможете управлять производительностью рендеринга.


Разработка шейдера со смещением вершин в Unity 2018.3

В этом видео мы покажем метод создания интерактивного эффекта смещения вершин с помощью Unity Shader Graph и Universal Render Pipeline.


Порталы в Unity с помощью Shader Graph! (обучающий материал)

Узнайте о том, как создать эффект портала с помощью Unity Universal Render Pipeline и Shader Graph. Загрузите проект и испытайте его в деле.


Наилучшие методики работы в Shader Graph

В этом докладе рассматриваются принципы работы системы, способы обхода распространенных ошибок и возможности Shader Graph.


Введение в Shader Graph

В этой серии из восьми уроков по Shader Graph мы покажем всю простоту разработки впечатляющих визуальных эффектов, включая свечение и растворение. Забудьте о программировании в разработке шейдеров.

Создавайте продвинутые эффекты


Настройки освещения в Shader Graph: расширение возможностей графов в Unity 2019

С выпуском Unity 2019.1 пакет Shader Graph официально получает статус готового к использованию! Unity 2019.2 предлагает новые функции и возможности, а также пример проекта.


Введение в Shader Graph: создавайте собственные шейдеры в визуальном редакторе

Unity 2018.1 вывела управляемость и гибкость на новый уровень и представила Shader Graph, который поможет как новичкам, так и профессионалам создавать новые шейдеры, например, текучую лаву, густую слизь, невероятные озера, мигающие светодиоды и многое другое.


Создание интерактивного вершинного эффекта в Shader Graph

Мы создали пример эффекта с интерактивным смещением вершин с помощью Shader Graph и LWRP, который поможет вам использовать данные функции для создания эффектов. В этой статье рассматривается процесс разработки эффекта.


Обновление Shader Graph в Unity 2018.3: узел Lit Master

В Unity 2018.3 появится новый мастер-узел HDRP для Shader Graph. Он называется Lit Master и открывает доступ к большинству улучшенных функций шейдинга HDRP в Shader Graph.


Движущиеся картины: создание анимированных материалов с Shader Graph

В Unity 2018.2 мы добавили вход Vertex Position в Shader Graph, реализовав возможность настраивать и анимировать меши. Узнайте о способах разработки шейдеров с анимацией вершин и о типичных вариантах реализации, например, шейдерах ветра и воды.


Обновления Shader Graph и пример проекта

В Unity 2018.1 появился новый инструмент Shader Graph, который позволяет создавать собственные шейдеры с помощью графического интерфейса. С тех пор мы добавили много новых и интересных функций. Познакомьтесь с примерами использования в демонстрационном проекте.

Читайте также: