В 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
}
}
}