В Unity обычно пишут шейдерпрограмму, которая работает на графическом процессоре. Подробнее
См. в Словарь программы на HLSL. Чтобы добавить код HLSL к вашему ресурсу шейдера, вы помещаете код в блок кода шейдера.
Эта страница содержит информацию об использовании блоков кода шейдера. Информацию о написании самого HLSL см. в разделе Использование HLSL в Unity.
Примечание. Unity также поддерживает написание шейдерных программ на других языках, хотя обычно это не требуется и не рекомендуется. Дополнительную информацию см. в разделе Написание шейдеров.
Совместимость конвейера рендеринга
| Функция | Встроенный конвейер рендеринга | Универсальный конвейер рендеринга (URP) | Конвейер рендеринга высокого разрешения (HDRP) | Пользовательский конвейер рендеринга с поддержкой сценариев |
|---|---|---|---|---|
| HLSLPROGRAM | Да | Да | Да | Да |
| HLSLINCLUDE | Да | Да | Да | Да |
| CGPROGRAM | Да | Нет | Нет | Yes
Несовместимо с пользовательскими конвейерами рендеринга, использующими ядро SRP пакет. |
| CGINCLUDE | Да | Нет | Нет | Yes
Несовместимо с пользовательскими конвейерами рендеринга, использующими ядро SRP пакет. |
Типы блоков кода шейдера
Для добавления кода HLSL можно использовать следующие типы блока кода шейдера:
- HLSLPROGRAM
- CGPROGRAM
- HLSLINCLUDE
- CGINCLUDE
Чтобы понять, что и когда использовать, вы должны понимать как их префикс (HLSL или CG), так и их суффикс ( ПРОГРАММА или ВКЛЮЧИТЬ).
Префиксы HLSL и CG
Разница между блоками, начинающимися с HLSL или CG, заключается в следующем:
- Блоки кода шейдера с префиксом
CGустарели. Они включают в себя несколько встроенных включаемых файлов шейдера Unity по умолчанию, что может быть удобно, если вам нужна эта функциональность. Встроенные включения совместимы только со встроенным конвейером рендеринга. - Блоки кода шейдера с префиксом
HLSLновее. По умолчанию они не включают файлы встроенного шейдера Unity, поэтому вы должны вручную включить любой библиотечный код, который хотите использовать. Они подходят для использования с любым конвейером рендеринга.
Информацию о включаемых файлах встроенных шейдеров Unity см. в разделе Включаемые файлы встроенных шейдеров.
ПРОГРАММА и ВКЛЮЧЕНИЕ суффиксов
Разница между блоками, которые заканчиваются на PROGRAM или INCLUDE, заключается в следующем:
- Блоки кода шейдера, оканчивающиеся на
PROGRAM, называются блоками программы шейдера. Вы используете их для написания шейдерных программ. Вы пишете код шейдера HLSL внутри этих блоков, а затем помещаете их в блок Pass в своей ShaderLabязык Unity для определения структуры шейдерных объектов. Подробнее
См. в коде Словарь. - Блоки кода шейдера, оканчивающиеся на
INCLUDE, называются включаемыми блоками шейдера. Вы используете их для совместного использования общего кода между программными блоками шейдеров в одном и том же исходном файле. Вы пишете код шейдера HLSL, которым хотите поделиться, внутри этих блоков, а затем помещаете его в блок Pass, SubShader или Shader в коде ShaderLab. Он работает аналогично включению в код HLSL.
Использование блока шейдерной программы
| Подпись | Функции |
|---|---|
HLSLPROGRAM[source code for shader programs, written in HLSL]ENDHLSL
|
Добавляет программу шейдера HLSL в проход, который включает этот программный блок шейдера. Не включает включаемые файлы встроенного шейдера Unity. |
CGPROGRAM[source code for shader programs, written in HLSL]ENDCG
|
Добавляет программу шейдера HLSL в проход, который включает этот программный блок шейдера. Включает несколько встроенных включаемых файлов шейдера Unity по умолчанию, что позволяет вам использовать встроенные переменные и функции. |
Пример
Shader "Examples/ExampleShader"
{
SubShader
{
Pass
{
Name "ExamplePassName"
Tags { "LightMode" = "ExampleLightModeTagValue" }
// ShaderLab commands to set the render state go here
HLSLPROGRAM
// HLSL shader code goes here
ENDHLSL
}
}
}
Использование блока включения шейдера
| Подпись | Функции |
|---|---|
HLSLINCLUDE[HLSL code that you want to share]ENDHLSL
|
Unity включает этот код во все шейдерные программы, определенные в блоках HLSLPROGRAM, в любом месте исходного файла. |
CGINCLUDE[HLSL code that you want to share]ENDCG
|
Unity включает этот код во все шейдерные программы, определенные в блоках CGPROGRAM, в любом месте исходного файла. |
Пример
Shader "Examples/ExampleShader"
{
SubShader
{
HLSLINCLUDE
// HLSL code that you want to share goes here
ENDHLSL
Pass
{
Name "ExampleFirstPassName"
Tags { "LightMode" = "ExampleLightModeTagValue" }
// ShaderLab commands to set the render state go here
HLSLPROGRAM
// This HLSL shader program automatically includes the contents of the HLSLINCLUDE block above
// HLSL shader code goes here
ENDHLSL
}
Pass
{
Name "ExampleSecondPassName"
Tags { "LightMode" = "ExampleLightModeTagValue" }
// ShaderLab commands to set the render state go here
HLSLPROGRAM
// This HLSL shader program automatically includes the contents of the HLSLINCLUDE block above
// HLSL shader code goes here
ENDHLSL
}
}
}

