Передавать информацию компиляторам шейдеров в HLSL
Чтобы передать информацию компиляторам шейдеров в высокоуровневом языке шейдеров (HLSL), используйте одну из следующих директив:
- Стандартная директива HLSL
#define. - Стандартная директива HLSL
#pragma, для передачи стандартных HLSL или Unity-специфических директив. - Директива Unity
#define_for_platform_compiler.
Добавить директиву #define
Unity поддерживает стандартную директиву HLSL #define. Дополнительные сведения см. в [#define directive](https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-pre-define) в документации Microsoft HLSL. Например:
Shader "Custom/ExampleShader"
{
SubShader
{
Pass
{
HLSLPROGRAM
// Define a symbol called EXAMPLE_SYMBOL
#define EXAMPLE_SYMBOL
// Add your shader code here
ENDHLSL
}
}
}
Добавить директиву #pragma
Используйте директиву #pragma для выполнения следующих действий:
- Передавать Unity-специфические директивы, например, для добавления ключевых слов шейдера или целевой специфической графики APIs. Дополнительную информацию см. в HLSL ссылка на директивы pragma.
- Передаёт стандартные директивы HLSL. Дополнительные сведения см. в [#pragma directive](https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-pre-pragma) в документации Microsoft HLSL.
Добавьте команду #pragma в любое место в вашем HLSLPROGRAM, но обычно в начале. Например:
Shader "Custom/ExampleShader"
{
SubShader
{
Pass
{
HLSLPROGRAM
// Target shader model 3.0
#pragma target 3.0
// Compile this shader only for Direct3D 11 and OpenGL Core
#pragma only_renderers d3d11 glcore
// Add your shader code here
ENDHLSL
}
}
}
Ограничения
Unity признает директивы #pragma только в следующих контекстах:
- Директивы, специфические для Unity: В файлах
.shaderили файлах, которые вы включаете с директивой#include_with_pragmas. - Стандартные директивы HLSL: В файлах вы включаете с директивой
#include.
Unity игнорирует директивы #pragma вне этих контекстов.
Примечание: Если файл шейдера использует #include для импорта файла, содержащего директиву #include_with_pragmas, Unity игнорирует директивы #pragma в файле, содержащем ссылки на директиву #include_with_pragmas.
Если вы помещаете директиву #pragma внутрь инструкции #if, условие должно зависеть от одного из следующих:
- Настраиваемый символ, который вы определяете в директиве
#define. - Макросы
SHADER_API_MOBILEилиSHADER_API_DESKTOP— макросы платформы для ветвления в зависимости от целевой платформы. - Макросы
UNITY_NO_RGBMилиUNITY_FRAMEBUFFER_FETCH_AVAILABLEдля ветвления на основе возможностей платформы. - Макрос
UNITY_USE_NATIVE_HDR. - Макрос
UNITY_NO_CUBEMAP_ARRAY. - Макрос
UNITY_VERSIONдля ветвления на основе версии Unity.
Добавление директивы #define_for_platform_compiler
Чтобы передать информацию компилятору шейдеров конкретной платформы, например компилятору FXC, если вы работаете с платформой, использующей DirectX, добавьте директиву #define_for_platform_compiler. Например:
Shader "Custom/ExampleShader"
{
SubShader
{
Pass
{
HLSLPROGRAM
// Define a symbol called EXAMPLE_SYMBOL for the platform-specific shader compiler
#define_for_platform_compiler EXAMPLE_SYMBOL
// Add your shader code here
ENDHLSL
}
}
}
Директива отправляет директиву #define в компилятор шейдеров для конкретной платформы. Например, #define_for_platform_compiler EXAMPLE_SYMBOL отправляет директиву #define EXAMPLE_SYMBOL в компилятор шейдеров.
Препроцессор Unity не использует символы, которые вы определяете с помощью #define_for_platform_compiler. Если вы используете символы внутри условных инструкций в вашем собственном коде шейдера, код не будет выполняться.
Дополнительные ресурсы
- Компиляция шейдеров
- HLSL ссылка на директивы pragma
- HLSL ссылка на команду pragma target
- HLSL pragma требуется ссылка на команду
- HLSL документация на вебсайте Майкрософта