Оптимизация шейдеров HLSL
В этом разделе описываются стратегии общего назначения, которые можно использовать для оптимизации шейдеров. Эти стратегии можно применять к шейдерам, написанным на любом языке, на любой платформе.
- Узнайте, где выполнять вычисления шейдеров
- Пропустить ненужные инструкции
- Паковать переменные и интерполяты
- Уменьшение сложности шейдера
- См. также
- Связанные темы
Узнайте, где выполнять вычисления шейдеров
Вершинные шейдеры выполняют операции, в том числе выборку вершин и матричное преобразование данных вершин. Как правило, вершинные шейдеры выполняются один раз для каждой вершины.
Пиксельные шейдеры выполняют операции, которые включают получение данных текстуры и вычисления освещения. Как правило, пиксельные шейдеры выполняются один раз за пиксель для заданного элемента геометрии.
Как правило, количество пикселей превышает количество вершин в сцене, поэтому пиксельные шейдеры выполняются чаще, чем вершинные шейдеры.
При разработке алгоритмов шейдера учитывайте следующее:
- По возможности выполняйте вычисления на вершинном шейдере. Вычисление, выполняемое в пиксельном шейдере, гораздо дороже, чем вычисление, выполняемое на вершинном шейдере.
- Рассмотрите возможность использования вычислений по вершинам для повышения производительности в таких ситуациях, как плотные сетки. Для плотных сеток вычисления по вершинам могут выдавать результаты, визуально неотличимые от результатов, полученных при вычислениях по пикселям.
Пропустить ненужные инструкции
В HLSL динамическое ветвление позволяет ограничить количество выполняемых инструкций. Таким образом, динамическое ветвление может помочь ускорить время выполнения шейдера. Если геометрия или пиксели не отображаются, используйте динамическое ветвление для выхода из шейдера или ограничения инструкций. Например, если пиксель не горит, нет смысла выполнять алгоритм освещения.
В следующей таблице перечислены некоторые случаи, когда можно проверить условия в шейдере и использовать динамическое ветвление, чтобы пропустить ненужные инструкции. Таблица не является исчерпывающей. Скорее, он предназначен для предоставления вам идей по оптимизации кода.
Проверяемое условие | Ответ в шейдере |
---|---|
Альфа-проверка определяет, что пиксель не будет виден. | Пропустите оставшуюся часть шейдера. |
Пиксель или геометрия полностью запотечены. | Пропустите оставшуюся часть шейдера. |
Вес кожи равен нулю. | Пропустить кости. |
Затухание света равно нулю. | Пропустить освещение. |
Не положительный ламбертовский термин. | Пропустить освещение. |
Паковать переменные и интерполяты
Помните о пространстве, необходимом для данных шейдера. Упакуйте как можно больше сведений в переменную или интерполятор. Иногда сведения из двух переменных можно упаковать в память одной переменной.
Уменьшение сложности шейдера
Держите шейдеры маленькими и простыми. Как правило, шейдеры с меньшим количеством инструкций выполняются быстрее, чем шейдеры с большим количеством инструкций. Кроме того, проще отлаживать и оптимизировать небольшие и менее сложные шейдеры.
См. также
Руководство по программированию для HLSL
Связанные темы