Введение в поверхностные шейдеры во Встроенном Render Pipeline
В Built-in Render Pipeline, поверхностные шейдеры являются упрощенным способом написания шейдеров, которые взаимодействуют с освещением.
Совместимость конвейера отображения
| Название особенности | Universal Render Pipeline (URP) | High Definition Render Pipeline (HDRP) | Изготовленный на заказ SRP | Built-in Render Pipeline |
|---|---|---|---|---|
| Шейдеры поверхностей | Нет | Нет | Нет | Да |
Чтобы создать настраиваемое освещение в URP и HDRP, выполните одно из следующих действий:
- Для упрощенного способа создания объектов Shader, см. Shader Graph.
- Скопируйте и измените код шейдера URP или HDRP, предоставленный в файлах пакета. Изменение может быть затруднено, так как код шейдера большой и сложный. Дополнительную информацию о поиске файлов пакета см. в Проверка пакетов.
Обзор
Написание шейдеров, которые взаимодействуют с освещением, сложно. Существуют различные типы освещения, различные варианты теней, различные пути рендеринга (переднее и отложенное рендеринг), и шейдер должен как-то справляться со всей этой сложностью.
Surface Shaders — это подход к генерации кода, который делает намного проще писать lit shaders, чем использовать низкоуровневые вершинно-пиксельные программы.
Для некоторых примеров, посмотрите Примеры поверхностных шейдеров.
Как это работает
Вы определяете «функцию поверхности», которая принимает любые UVs или данные, которые вам нужны, в качестве входа, и заполняет структуру выхода SurfaceOutput. SurfaceOutput в основном описывает свойства поверхности (его цвет альбедо, нормаль, эмиссию, зеркальность и т.д.). Вы пишете этот код в HLSL.
Затем компилятор Surface Shader определяет, какие входы нужны, какие выходы заполняются и т.д., и генерирует фактические вершинно-пиксельные шейдеры, а также рендеринговые проходы для обработки прямого и отложенного рендеринга.
Поверхностные шейдеры и DirectX 11 HLSL синтаксис
В настоящее время некоторые части конвейера компиляции поверхностных шейдеров не понимают синтаксис DirectX 11-specific HLSL, так что если вы используете HLSL функции, такие как StructuredBuffers, RWTextures и другие не-DX9 синтаксические элементы, вам придется обернуть их в макрос препроцессора только для DX11.
См. Различия для конкретных платформ и Использование HLSL страницы для подробностей.