Unity 6.3
0 онлайн 120 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 238 из 442

Использовать 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 в свой шейдер.

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