Unity 6.3
0 онлайн 85 гостей 3 в системе
Вход

Передавать информацию компиляторам шейдеров в 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_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. Если вы используете символы внутри условных инструкций в вашем собственном коде шейдера, код не будет выполняться.

Дополнительные ресурсы