Введение

Язык затенения

Язык затенения высокого уровня (HLSL) — это проприетарный язык затенения, разработанный Microsoft для API Direct3D 9 для дополнения языка ассемблера шейдеров и впоследствии ставший обязательным языком затенения для унифицированной модели шейдеров Direct3D 10 и более поздних версий. HLSL аналогичен языку затенения GLSL, используемому со стандартом OpenGL. Он очень похож на язык затенения Nvidia Cg, поскольку разрабатывался параллельно с ним. Ранние версии этих двух языков считались идентичными, различаясь лишь маркетингом. Шейдеры HLSL позволяют значительно повысить скорость и детализацию, а также реализовать множество специальных эффектов как в 2D, так и в 3D компьютерной графике. Программы HLSL представлены в шести формах: пиксельные шейдеры (соответствующие фрагментным шейдерам в GLSL), вершинные шейдеры, геометрические шейдеры, вычислительные шейдеры, шейдеры тесселяции (шейдеры корпуса и домена) и шейдеры трассировки лучей (шейдеры генерации лучей, шейдеры пересечения, шейдеры попадания любого/ближайшего/пропуска). Вершинный шейдер выполняется для каждой вершины, передаваемой приложением, и в основном отвечает за преобразование вершины из объектного пространства в пространство просмотра, генерацию координат текстур и вычисление коэффициентов освещения, таких как нормали, тангенсы и битангенсы вершины. Когда группа вершин (обычно 3, образующих треугольник) проходит через вершинный шейдер, их выходные позиции интерполируются для формирования пикселей в пределах этой области; этот процесс известен как растрирование. При желании приложение, использующее интерфейс Direct3D 10/11/12 и аппаратное обеспечение Direct3D 10/11/12, может также указать геометрический шейдер. Этот шейдер принимает в качестве входных данных некоторые вершины примитива (треугольник/линия/точка) и использует эти данные для генерации/дегенерации (или тесселяции) дополнительных примитивов или для изменения типа примитивов, каждый из которых затем отправляется в растризатор. D3D11.3 и D3D12 представили Shader Model 5.1 и, позднее, 6.0.

Сравнение моделей шейдеров

Перечисленные графические процессоры — это оборудование, которое впервые поддержало указанные спецификации. Производители, как правило, обеспечивают поддержку всех более ранних моделей шейдеров через драйверы. Следует отметить, что игры могут указывать требование к определенной версии DirectX, но не обязательно нуждаются в графическом процессоре, полностью соответствующем этой спецификации, поскольку разработчики могут использовать более новую версию DirectX API для поддержки оборудования с более низкими характеристиками Direct3D. Например, DirectX 9 предоставляет функции, доступные на оборудовании уровня DirectX 7, которых не было в DirectX 7, ориентируясь на его фиксированный конвейер T&L.

Сравнение пиксельных теней

Версия пиксельного шейдера 1.0 – 1.3
1.42.0a2.0b3.04.0 4.1 5.0Предел зависимых текстур4 6 8 Неограниченно 8 Неограниченно НеограниченноПредел инструкций текстур4 6*2 32 Неограниченно Неограниченно Неограниченно НеограниченноРегистр позиции ✔ ✔Слоты инструкций8+4 8+4 32 + 64 512 512 ≥ 512 ≥ 65536Выполненные инструкции8+4 6*2+8*2 32 + 64 512 512 65536 НеограниченноКосвенные обращения к текстурам4 4 4 Неограниченно 4 Неограниченно НеограниченноИнтерполированные регистры2 + 4 2 + 6 2 + 8 2 + 8 2 + 8 10 32Предсказание инструкций ✔ ✔ Входные регистры индексов ✔ ✔Временные регистры2 6 12 до 32 22 32 32 4096Константные регистры8 8 32 32 32 224 16×4096Произвольное перетасовки ✔ ✔ ✔Инструкции градиента ✔ ✔ ✔Регистр количества циклов ✔ ✔Регистр грани (двустороннее освещение) ✔ ✔ ✔Динамическое управление потоком ✔ (24) ✔ (64)Побитовые операторы ✔Нативные целые числа ✔

PS 1.0 — Невыпущенный 3dfx Rampage, DirectX 8
PS 1.1 — GeForce 3, DirectX 8
PS 1.2 — 3Dlabs Wildcat VP, DirectX 8.1
PS 1.3 — GeForce 4 Ti, DirectX 8.1
PS 1.4 — Radeon 8500 9250, Matrox Parhelia, DirectX 8.1
Shader Model 2.0 — Radeon 9500 9800/X300 X600, DirectX 9
Shader Model 2.0a — Оптимизированная модель GeForce FX/PCX, DirectX 9.0a
Shader Model 2.0b — Модель шейдера Radeon X700 X850, DirectX 9.0b
Shader Model 3.0 — Radeon X1000 и GeForce 6, DirectX 9.0c
Shader Model 4.0 — Radeon HD 2000 и GeForce 8, DirectX 10
Shader Model 4.1 — Radeon HD 3000 и GeForce 200, DirectX 10.1
Shader Model 5.0 — Radeon HD 5000 и GeForce 400, DirectX 11
Shader Model 5.1 — GCN 1+, Fermi+, DirectX 12 (11 0+) с WDDM 2.0
Shader Model 6.0 — GCN 1+, Kepler+, DirectX 12 (11 0+) с WDDM 2.1
Shader Model 6.1 — GCN 1+, Kepler+, DirectX 12 (11 0+) с WDDM 2.3
Shader Model 6.2 — GCN 1+, Kepler+, DirectX 12 (11 0+) с WDDM 2.4
Shader Model 6.3 — GCN 1+, Kepler+, DirectX 12 (11 0+) с WDDM 2.5
Shader Model 6.4 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11 0+) с WDDM 2.6
Shader Model 6.5 — GCN 1+, Kepler+, Skylake+, DirectX 12 (11 0+) с WDDM 2.7
Shader Model 6.6 — GCN 4+, Maxwell+, DirectX 12 (11 0+) с WDDM 3.0
Shader Model 6.7 — GCN 4+, Maxwell+, DirectX 12 (12 0+) с WDDM 3.1

"32 + 64" для Выполненных инструкций означает "32 инструкции текстур и 64 арифметические инструкции."

Сравнение вертикальных теней

Версия вершинного шейдера VS 1.1 VS 2.0 VS 2.0a VS 3.0 VS 4.0 VS 4.1 VS 5.0
# слотов инструкций 128 256 256 ≥ 512 ≥ 65536
Максимальное количество выполненных инструкций 128 1024 65536 65536 Неограниченно
Прогнозирование инструкций ✔ ✔ ✔
Временные регистры 12 12 16 32 4096
# константных регистров ≥ 96 ≥ 256 256 ≥ 256 16×4096
Статический контроль потока ✔ ✔ ✔ ✔
Динамический контроль потока ✔ ✔ ✔
Глубина динамического контроля потока 24 24 64
Выборка вершинных текстур ✔ ✔
# сэмплеров текстур 4 128
Поддержка инстанцирования геометрии ✔ ✔
Битовые операторы ✔
Нативные целые числа ✔