Поделиться через


Оптимизация шейдеров HLSL

В этом разделе описаны стратегии общего назначения, которые можно использовать для оптимизации шейдеров. Эти стратегии можно применять к шейдерам, написанным на любом языке, на любой платформе.

Узнайте, где следует выполнять вычисления шейдера

Шейдеры вершин выполняют операции, включающие получение вершин и преобразование матрицы данных вершин. Как правило, вершинные шейдеры выполняются один раз на вершину.

Шейдеры пикселей выполняют операции, включающие получение данных текстуры и выполнение вычислений освещения. Как правило, пиксельные шейдеры выполняются один раз для каждого пикселя заданной геометрии.

Как правило, пикселей больше, чем вершин в сцене, поэтому шейдеры пикселей выполняются чаще, чем шейдеры вершин.

При разработке алгоритмов шейдера помните следующее:

  • Если это возможно, выполните вычисления на вершинном шейдере. Вычисление, выполняемое на шейдере пикселей, гораздо дороже, чем вычисление, выполняемое на вершинном шейдере.
  • Рассмотрите возможность использования по-вершинных вычислений для повышения производительности в таких ситуациях, как плотные сетки. Для плотных сеток вычисления по вершинам могут давать результаты, которые визуально не отличаются от полученных расчетами по пикселям.

Пропуск ненужных инструкций

В HLSL динамическая ветвь позволяет ограничить количество выполняемых инструкций. Таким образом, динамическое ветвление может помочь ускорить выполнение шейдера. Если геометрия или пиксели не отображаются, используйте динамическое ветвление для выхода из шейдера или ограничения инструкций. Например, если пиксель не освещен, нет смысла выполнять алгоритм освещения.

В следующей таблице перечислены некоторые случаи, в которых можно протестировать условия в шейдере и использовать динамическое ветвление, чтобы пропустить ненужные инструкции. Таблица не является исчерпывающей. Скорее, он предназначен для предоставления идей для оптимизации кода.

Условие для проверки Ответ в шейдере
Альфа-проверка определяет, что пиксель не будет виден. Пропустите остальную часть шейдера.
Пиксель или геометрия полностью затуманены. Пропустите остальную часть шейдера.
Вес кожи равен нулю. Пропустить кости.
Световая аттенуация равна нулю. Пропустить освещение.
Неположительный ламбертовый термин. Пропустить освещение.

 

Переменные и интерполяты пакетов

Помните о пространстве, необходимом для данных шейдера. Соберите как можно больше информации в переменную или интерполянт. Иногда данные из двух переменных можно упаковать в пространство памяти одной переменной.

Уменьшение сложности шейдера

Держите шейдеры небольшими и простыми. Как правило, шейдеры с меньшим количеством инструкций выполняются быстрее, чем шейдеры с дополнительными инструкциями. Кроме того, проще отлаживать и оптимизировать меньшие, менее сложные шейдеры.

Руководство по программированию для HLSL

Руководство по программированию для HLSL