Использовать 16-битную точность в шейдерах
По умолчанию GPUs использует 32-битную точность. Вы можете использовать 16-битную точность вместо этого в расчетах GPU, что имеет следующие преимущества на мобильных платформах:
- Шейдеры используют меньше памяти, пропускной способности и энергии.
- Использование меньшего количества бит может улучшить распределение регистров в GPU.
Создание 16-битной переменной
Чтобы использовать 16-битную точность в шейдере, используйте half при объявлении скаляра, вектора или матрицы. Например:
half _Glossiness;
half4 _Color;
half4x4 _Matrix;
Примечание: Unity не поддерживает суффиксы с плавающей точкой HLSL. Например, если вы используете 2.0h для создания полуточного флоута, Unity рассматривает его как высокоточный флоут 2.0f.
Чтобы использовать 16-битную точность в семплере текстуры, добавьте half4 при объявлении текстуры. Например:
Texture2D<half4> _MainTex;
16-битная точность может быть недостаточной для некоторых расчетов шейдеров. Это может привести к видимым ошибкам, таким как цветовые полосы или замедление геометрии. Чтобы проверить на ошибки, запустите проект на платформе, поддерживающей half. Если есть ошибки, используйте float вместо этого.
Переменная half хранится в буферах с размером и выравниванием 32 бита.
Использовать 16-разрядные значения на большем количестве платформ
По умолчанию half не влияет на платформы с более высокой производительностью в Unity, например платформы, использующие MacOS. Переменная half становится переменной float, а GPU использует 32-битные значения для вычислений.
Чтобы использовать 16-битную точность на большем количестве платформ, перейдите в Изменить > Project Настройки > Игрок и установите Модель точности шейдера на Униформа. Unity затем рассматривает half в вашем HLSL коде следующим образом:
min16floatдля скальеровfloatдля семплеров текстур
Когда Unity компилирует шейдеры, min16float становится типом данных платформы, который позволяет GPU использовать 16-битную точность для расчетов, если он их поддерживает. Например:
- Если вы используете DirectX 11 или 12, переменная остается
min16float. - Если вы используете OpenGL, переменная становится
mediump. - Если вы используете Vulkan, переменная становится
RelaxedPrecisionс плавающей точкой. - Если вы используете Metal, переменная становится
float, но GPU использует 16-битные значения для вычислений.
Чтобы переопределить Модель точности шейдера настройка для текстур, добавить _half при объявлении семплер текстуры. Например, Texture2D<half4> _MainTex.
Примечание: В версиях до Unity 6 размер min16float варьировался в зависимости от целевой платформы, если вы выбрали графику Metal API. Чтобы включить это поведение в Unity 6 и более поздних версиях, включите #pragma metal_fxc_allow_float16_in_cpu_visible_buffers в свой шейдер.
Дополнительные ресурсы
- Типы данных (HLSL) в документации Microsoft HLSL
- Оптимизация шейдеров
- Запись шейдеров для различных графиков APIs