Часть 1. Базовая настройка проекта и объяснение

Установка, версии и требования: Unity 5.6.0f3 и модель с большим количеством полигонов.

Целевая аудитория

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

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

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

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

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

Далее нам нужно создать новый шейдер для работы. Щелкните правой кнопкой мыши в окне проекта и выберите Create -> Shader -> Standard Surface Shader. Назовите новый шейдер «JellyShader». Теперь у нас есть базовый поверхностный шейдер Unity. Теперь давайте создадим материал, использующий этот шейдер. Щелкните правой кнопкой мыши JellyShader и выберите «Создать» -> «Материал». Переименуйте новый материал в «JellyMaterial». Этот процесс создает материал, который уже назначен шейдеру «JellyShader».

Материалы и шейдеры

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

Файлы GLSL, CG и ShaderLab

Шейдеры могут быть написаны на нескольких разных, но очень похожих языках. Включая GLSL, HLSL и CG. Сама Unity использует что-то под названием ShaderLab. ShaderLab — это абстракция на один уровень выше GLSL или CG, которая сообщает Unity, как визуализировать сетку. Этот файл ShaderLab также содержит фактический код шейдера GLSL или CG, который мы пишем для рендеринга эффекта желе.

Поверхностные шейдеры Unity

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

Теперь, когда у нас есть материал, осталось перетащить наш материал JellyMaterial на нашу сферу. Давайте проверим, что шейдер прикреплен к нашей модели. На вкладке Hierarchy выберите свою модель. В нижней части вкладки «Инспектор» в разделе «Mesh Renderer» должно быть указано «Shader: Custom/JellyShader». Если вы не видите Mesh Renderer на вкладке инспектора, вам может потребоваться перейти к дочерним элементам вашей модели на вкладке Hierarchy. Например, если вы используете предоставленную мной модель, искомый объект — это объект «по умолчанию», который является дочерним элементом «High-Poly-Sphere».

Как только вы нашли свой шейдер в своей модели, разверните раздел шейдера. Поскольку мы использовали «Стандартный шейдер поверхности», в наш шейдер уже должно быть встроено несколько параметров, включая «Цвет», «Альбедо», «Гладкость» и «Металлик».

Физически обоснованный рендеринг

Стандартный поверхностный шейдер Unity использует физически корректный рендеринг (PBR). Как обычно, обратитесь к официальной документации Unity за подробным описанием работы с PBR.

Не стесняйтесь играть здесь с цветом материала, гладкостью и металликом. Я изменил свою сферу на нежно-голубую. Теперь пришло время приступить к написанию нашего шейдера. Дважды щелкните JellyShader. Он должен запуститься в Visual Studio или Mono. Давайте быстро разберем все, что включено в этот шейдер по умолчанию.

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

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

Нежное введение

Если вам нужно более подробное объяснение этих тегов и директив компилятора или вы просто хотите лучше понять, как работают шейдеры внутри Unity, я настоятельно рекомендую прочитать замечательную серию статей Алана Зуккони Нежное введение в шейдеры в Unity 3D. .»

_MainTex, _Glossiness, _Metallic и _Color — это некоторые из переменных, которые мы будем использовать при создании нашего шейдера. Обратите внимание, что они называются точно так же, как и их аналоги свойств. Чтобы использовать переменную из редактора, ее необходимо указать в разделе свойств и объявить в теле шейдера.

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

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

Следующая строка fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; использует функцию tex2D, чтобы получить цвет для этого конкретного пикселя из текстуры, предоставленной _MainTex, и подкрасить его цветом, предоставленным _Color. Последний шаг — заполнить объект SurfaceOutputStandard нашими окончательными значениями.

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

Вторую часть этой серии можно найти здесь.

Первоначально опубликовано на heliosinteractive.com 24 января 2018 г.