Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Написание шейдеров поверхности

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

Совместимость конвейера рендеринга

Название функции Встроенный конвейер рендеринга Универсальный конвейер рендеринга (URP) Конвейер рендеринга высокого разрешения (HDRP) Пользовательский SRP
Surface Shaders Да No

Чтобы узнать об упрощенном способе создания объектов Shader в URP, см. раздел Shader Graph.

No

Об упрощенном способе создания объектов Shader в HDRP см. Shader Graph.

Нет

Обзор

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

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

Некоторые примеры см. в примерах шейдеров поверхности и примерах пользовательского освещения шейдеров поверхности.

Как это работает

Вы определяете «поверхностную функцию», которая принимает любые UV-развертки или данные, которые вам нужны, в качестве входных данных и заполняет выходную структуру SurfaceOutput. SurfaceOutput в основном описывает свойства поверхности (цвет альбедо, нормаль, излучение, зеркальность и т. д.). Вы пишете этот код на HLSL.

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

Стандартная структура вывода поверхностных шейдеров такова:

struct SurfaceOutput { fixed3 Albedo; // diffuse color fixed3 Normal; // tangent space normal, if written fixed3 Emission; half Specular; // specular power in 0..1 range fixed Gloss; // specular intensity fixed Alpha; // alpha for transparencies };

В Unity 5 поверхностные шейдеры также могут использовать физические модели освещения. Встроенные модели освещения Standard и StandardSpecular (см. ниже) используют эти выходные структуры соответственно:

struct SurfaceOutputStandard { fixed3 Albedo; // base (diffuse or specular) color fixed3 Normal; // tangent space normal, if written half3 Emission; half Metallic; // 0=non-metal, 1=metal half Smoothness; // 0=rough, 1=smooth half Occlusion; // occlusion (default 1) fixed Alpha; // alpha for transparencies }; struct SurfaceOutputStandardSpecular { fixed3 Albedo; // diffuse color fixed3 Specular; // specular color fixed3 Normal; // tangent space normal, if written half3 Emission; half Smoothness; // 0=rough, 1=smooth half Occlusion; // occlusion (default 1) fixed Alpha; // alpha for transparencies };

Образцы

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

Директивы компиляции шейдера поверхности

Шейдер поверхности размещается внутри блока CGPROGRAM..ENDCG, как и любой другой шейдер. Различия:

  • Он должен быть помещен внутри блока SubShader, а не внутри Pass. Поверхностный шейдер сам скомпилируется в несколько проходов.
  • Он использует директиву #pragma surface ..., чтобы указать, что это поверхностный шейдер.

Директива #pragma surface:

#pragma surface surfaceFunction lightModel [optionalparams]

Обязательные параметры

  • surfaceFunction — какая функция Cg имеет код поверхностного шейдера. Функция должна иметь вид void surf (Input IN, inout SurfaceOutput o), где Input — это определенная вами структура. Входные данные должны содержать любые координаты текстуры и дополнительные автоматические переменные, необходимые для функции поверхности.
  • lightModel — используемая модель освещения. Встроенные физически основаны Standard и StandardSpecular, а также простые нефизически основаны Ламберт (диффузный) и БлиннФонг (зеркальный). См. страницу Пользовательские модели освещения, чтобы узнать, как написать свои собственные.
    • Стандартная модель освещения использует выходную структуру SurfaceOutputStandard и соответствует шейдеру Standard (металлический рабочий процесс) в Unity.
    • Модель освещения StandardSpecular использует выходную структуру SurfaceOutputStandardSpecular и соответствует шейдеру Standard (настройка отражения) в Unity.
    • Модели освещения Lambert и BlinnPhong не имеют физической основы (из Unity 4.x), но шейдеры, использующие их, могут быть быстрее для рендеринга на слабом оборудовании.

Необязательные параметры

Прозрачность и альфа-тестирование управляются директивами alpha и alphatest. Прозрачность обычно может быть двух видов: традиционное альфа-смешивание (используемое для затухания объектов) или более физически правдоподобное «предумноженное смешение» (которое позволяет полупрозрачным поверхностям сохранять правильные зеркальные отражения). При включении полупрозрачности сгенерированный код шейдера поверхности будет содержать команды смешивания; тогда как включение альфа-вырезки приведет к отбрасыванию фрагмента в сгенерированном пикселенаименьшей единице компьютерного изображения. Размер пикселя зависит от разрешения вашего экрана. Пиксельное освещение рассчитывается для каждого пикселя экрана. Подробнее
См. в Словарь
на основе заданной переменной.

  • alpha или alpha:auto — будет выбрана прозрачность при исчезновении (аналогично alpha:fade) для простых функций освещения и предварительно умноженной прозрачности (такой же, как alpha:premul) для физических функций освещения.
  • alpha:blend — включить альфа-смешивание.
  • alpha:fade – включить традиционную прозрачность при исчезновении.
  • alpha:premul – включить альфа-прозрачность с предварительным умножением.
  • alphatest:VariableName — включить прозрачность альфа-канала. Значение отсечки находится в переменной с плавающей запятой с VariableName. Вероятно, вы также захотите использовать директиву addshadow для создания правильного прохода отбрасывателя теней.
  • keepalpha — по умолчанию шейдеры непрозрачных поверхностей записывают 1.0 (белый) в альфа-канал, независимо от того, что выводится в альфа-канале выходной структуры или что возвращается функцией освещения. Использование этой опции позволяет сохранить альфа-значение функции освещения даже для непрозрачных шейдеров поверхности.
  • decal:add — аддитивный шейдер декалей (например, Terrain AddPass). Это предназначено для объектов, которые лежат поверх других поверхностей и используют аддитивное смешивание. См. примеры шейдеров поверхности.
  • decal:blend — полупрозрачный шейдер декалей. Это предназначено для объектов, которые лежат поверх других поверхностей и используют альфа-смешивание. См. примеры шейдеров поверхности.

Пользовательские функции-модификаторы можно использовать для изменения или вычисления входящих данных вершин или для изменения окончательного вычисленного цвета фрагмента.

  • vertex:VertexFunction — пользовательская функция модификации вершин. Эта функция вызывается при запуске сгенерированного вершинного шейдерапрограммы, которая запускается для каждой вершины 3D-модели во время рендеринга модели. . Подробнее
    Смотреть в Словарь
    и может изменять или вычислять данные для каждой вершины. См. примеры шейдеров поверхности.
  • finalcolor:ColorFunction — пользовательская функция изменения конечного цвета. См. примеры шейдеров поверхности.
  • finalgbuffer:ColorFunction – пользовательский отложенный путь для изменения содержимого G-буфера.
  • finalprepass:ColorFunction – настраиваемый базовый путь предварительного прохода.

Тени и тесселяция – можно задать дополнительные директивы для управления обработкой теней и тесселяции.

  • addshadow — создание прохода отбрасывателя теней. Обычно используется с пользовательской модификацией вершин, так что отбрасывание теней также получает любую процедурную анимацию вершин. Часто шейдеры не нуждаются в какой-либо специальной обработке теней, так как они могут просто использовать проход заклинателя теней из резервной копии.
  • fullforwardshadows – поддержка всех типов светлых теней в Forward путь рендерингаТехника, которую Unity использует для рендеринга графики. Выбор другого пути влияет на производительность вашей игры и на то, как рассчитываются освещение и затенение. Некоторые пути больше подходят для разных платформ и оборудования, чем другие. Подробнее
    См. в Словарь
    . По умолчанию шейдеры поддерживают только тени от одного направленного источника света при упреждающем рендерингепути рендеринга, при котором каждый объект визуализируется за один или несколько проходов, в зависимости на источники света, воздействующие на объект. Сами источники света также обрабатываются Forward Rendering по-разному, в зависимости от их настроек и интенсивности. Подробнее
    См. в Словаре
    (чтобы сэкономить на внутреннем количестве вариантов шейдера). Используйте эту директиву, если вам нужны точечные или прожекторные тени при прямом рендеринге.
  • tessellate:TessFunction — использовать тесселяцию графического процессора DX11; функция вычисляет коэффициенты тесселяции. Дополнительные сведения см. в разделе Тесселяция шейдеров поверхности.

Параметры генерации кода: по умолчанию сгенерированный код поверхностного шейдера пытается обработать все возможные варианты освещения/тени/карту освещенияПредварительно обработанная текстура, содержащая эффекты источников света на статических объектах сцены. Карты освещения накладываются поверх геометрии сцены для создания эффекта освещения. Подробнее
См. в сценариях Словарь
. Однако в некоторых случаях вы знаете, что некоторые из них вам не понадобятся, и можно настроить сгенерированный код, чтобы пропустить их. Это может привести к тому, что шейдеры меньшего размера будут загружаться быстрее.

  • exclude_path:deferred, exclude_path:forward, exclude_path:prepass — не генерировать проходы для заданного пути рендеринга (Deferred Shadingпуть рендеринга в встроенном -in Render Pipeline, который не накладывает ограничений на количество источников света, которые могут воздействовать на GameObject.Все источники света оцениваются попиксельно, что означает, что все они правильно взаимодействуют с картами нормалей и т. д. Кроме того, все источники света могут иметь файлы cookie и тени . Подробнее
    См. в Словарь
    , Forward и устаревшее отложенное освещение соответственно).
  • noshadow — отключает всю поддержку получения теней в этом шейдере.
  • noambient – не применять окружающее освещение или световые датчикисветовые датчики сохраняют информацию о том, как свет проходит через пространство в вашей сцене. Набор световых зондов, расположенных в заданном пространстве, может улучшить освещение движущихся объектов и статических пейзажей LOD в этом пространстве. Подробнее
    См. в Словарь
    .
  • novertexlights: не применяйте пробники света или повершинные источники света при прямом рендеринге.
  • nolightmap — отключает всю поддержку карты освещения в этом шейдере.
  • nodynlightmap — отключает динамическое глобальное освещениегруппу методов, моделирующих как прямое и непрямое освещение для обеспечения реалистичных результатов освещения. В Unity есть две системы глобального освещения, сочетающие прямое и непрямое освещение: запеченное глобальное освещение и глобальное освещение в реальном времени.
    См. поддержку Словарь
    в этом шейдере.
  • nodirlightmap — отключает поддержку направленных карт освещения в этом шейдере.
  • nofog — отключает всю встроенную поддержку тумана.
  • nometa – не генерирует "мета" проход (используемый картами освещения и динамическим глобальным освещением для извлечения информации о поверхности).
  • noforwardadd — отключает форвардный аддитивный проход рендеринга. Это заставляет шейдер поддерживать один полный направленный источник света, а все остальные источники света вычисляются для каждой вершины/SH. Также уменьшает размер шейдеров.
  • nolppv — отключает Light Probe Proxy Volumeкомпонент, который позволяет использовать больше информация об освещении для больших динамических игровых объектов, которые не могут использовать запеченные карты освещения (например, большие системы частиц или скинированные сетки). Подробнее
    См. поддержку Словарь
    в этом шейдере.
  • noshadowmask — отключает поддержку Shadowmask для этого шейдера (оба ShadowmaskТекстура, которая имеет тот же макет UV и разрешение с соответствующей картой освещения. Подробнее
    См. в Словарь
    и Маска теней на расстоянииВерсия режима освещения Маска теней, которая включает высококачественные тени, отбрасываемые от статических игровых объектов на динамические игровые объекты. Подробнее
    См. в Словарь
    ).

Разные параметры

  • softvegetation: шейдер поверхности отображается только при включенной функции Soft Vegetation.
  • interpolateview — вычислить направление взгляда в вершинном шейдере и интерполировать его; вместо того, чтобы вычислять его в пиксельном шейдере. Это может ускорить пиксельный шейдер, но использует еще один интерполятор текстуры.
  • halfasview — передать в функцию освещения половинный вектор направления вместо направления взгляда. Полунаправление будет вычислено и нормализовано для каждой вершины. Это быстрее, но не совсем правильно.
  • приблизительное представление — удалено в Unity 5.0. Вместо этого используйте interpolateview.
  • dualforward — используйте двойные карты освещения в пути рендеринга forward.
  • dithercrossfade — позволяет поверхностному шейдеру поддерживать эффекты дизеринга. Затем вы можете применить этот шейдер к GameObjectsфундаментальному объекту в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки. , и больше. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
    См. в Словарь
    , где используется Группа LODКомпонент для управления уровнем детализации (LOD) для игровых объектов. Подробнее
    См. в компоненте Словарь
    , настроенном для режима плавного перехода.

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

Структура ввода шейдера поверхности

Входная структура Input обычно имеет любые координаты текстуры, необходимые шейдеру. Координаты текстуры должны называться "uv", за которым следует имя текстуры (или начинаться с "uv2", чтобы использовать второй набор координат текстуры). ).

Дополнительные значения, которые можно поместить в структуру ввода:

  • float3 viewDir – содержит направление взгляда для расчета эффектов параллакса, подсветки по краям и т. д.
  • float4 с семантикой COLOR — содержит интерполированный цвет для каждой вершины.
  • float4 screenPos – содержит положение на экране для отражения или эффектов на экране. Обратите внимание, что это не подходит для GrabPass; вам нужно самостоятельно вычислить пользовательский UV с помощью функции ComputeGrabScreenPos.
  • float3 worldPos – содержит позицию в мировом пространстве.
  • float3 worldRefl — содержит вектор отражения мира, если поверхностный шейдер не записывает в o.Normal. Например, см. шейдер Reflect-Diffuse.
  • float3 worldNormal — содержит вектор нормали к миру, если поверхностный шейдер не записывает o.Normal.
  • float3 worldRefl; INTERNAL_DATA — содержит вектор отражения мира, если поверхностный шейдер записывает в o.Normal. Чтобы получить вектор отражения на основе попиксельной карты нормалейТип текстуры карты рельефа, который позволяет добавлять детали поверхности, такие как неровности, бороздки и царапины модели, которые отражают свет, как если бы они были представлены реальной геометрией. Подробнее
    См. в Словарь
    , используйте WorldReflectionVector (IN , о.Обычный). Например, см. шейдер Reflect-Bumped.
  • float3 worldNormal; INTERNAL_DATA — содержит вектор мировой нормали, если поверхностный шейдер записывает в o.Normal. Чтобы получить вектор нормалей на основе попиксельной карты нормалей, используйте WorldNormalVector (IN, o.Normal).

Поверхностные шейдеры и синтаксис DirectX 11 HLSL

В настоящее время некоторые части конвейера компиляции поверхностных шейдеров не понимают специфичный для DirectX 11 синтаксис HLSL, поэтому, если вы используете функции HLSL, такие как StructuredBuffers, RWTextures и другие не-DX9 синтаксис, вы должны обернуть его в макрос препроцессора только для DX11.

Дополнительные сведения см. в разделах Различия между платформами и Использование HLSL.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3