Унифицированная шейдерная модель

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:22, 1 июня 2016.

Унифицированная шейдерная модель (англ. Unified shader mdoel) — модель, которая описывает программный уровень. Существует также унифицированная шейдерная архитектура (англ. Unified Shading Architecture), описывающая аппаратный уровень.

ATI Radeon HD 3300, совместимый с DirectX 10 Shader Model 4.0

Шейдеры

Шейдеры – это программа, состоящая из набора ключевых слов, которая позволяет программисту работать напрямую с вершинами и пикселями. Суть шейдерных программ заключается в том, что эта программа исполняется графическим процессором видеоадаптера. Сделано это для того, чтобы избежать массы повторяющихся операций в коде программы, снизить нагрузку центрального процессора и иметь возможность обращения к процессору видеокарты напрямую. Все эти действия приводят к быстрой работе программы и повышению качества графических эффектов. Графический процессор видеокарты работает несколько иначе, чем центральный процессор приставки Xbox 360, и в связи с этим для доступа к процессору необходимо иметь свой набор команд, или язык программирования. Ранее в DirectX для этих целей использовался ассемблероподобный язык программирования шейдеров, состоящий из набора определенных инструкций. В те времена шейдерные программы были небольшими, поэтому языка, основанного на инструкциях, вполне хватало. Со временем шейдерные программы увеличивались, да и сама технология программирования шейдеров развивается и по сей день.

Начало шейдерных моделей

Со временем на замену ассемблерного языка программирования шейдеров пришел новый язык с названием HLSL (High-Level Shaders Language, или высокоуровневый язык программирования шейдеров). Этот язык более прост в использовании и имеет большое сходство с языком программирования С. В момент появления языка HLSL была предложена Shaders Models 1.0. Это версия описания шейдерной модели для использования шейдерных программ в программировании графики. Шейдерная модель предъявляет набор требований для графического процессора видеокарты, которые он обязан иметь или исполнять.

Имеется набор определенных инструкций, которые может выполнить видеоадаптер с поддержкой Shaders Models 1.0, и если вы попробуете на этом видеоадаптере использовать шейдерную модель версии 3.0, то произойдет ошибка в работе программы. Фактически шейдерная модель описывает тот набор операций, который графический процессор видеокарты может или даже способен выполнить. Например, в Shaders Models 1.0 нет возможности использовать циклы, а во второй версии такая возможность (для видеоадаптеров) была добавлена.

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

foreach (GraphicsAdapter adapter in GraphicsAdapter.Adapters)
{
        GraphicsDeviceCapabilities caps = adapter.GetCapabilities(DeviceType.Hardware);

        // проверка второй версии шейдерной модели
        if (caps.MaxPixelShaderProfile < ShaderProfile.PS_2_0)
        {
                System.Diagnostics.Debug.WriteLine(«Нет поддержки Shader Model 2.0.»);
        }
}

Этот код в основном предназначен для компьютерных систем, но есть и более рациональные решения поддержки различных версий шейдеров. Например, написание универсальных шейдерных программ, использующих исключительно синтаксис всех моделей шейдеров, или написание отдельных блоков кода для всех трех или двух последних версий шейдерных моделей. Для приставки Xbox 360 Shaders Models 2.0 – это основная модель, и на базе этой модели необходимо писать шейдерные программы.

Механизм работы шейдерных программ

Шейдерные программы пишутся в обычных инструментариях (продукты семейства Visual Studio, RenderMonkey, FX Composer…) и сохраняются в отдельных файлах с расширением FX. Затем этот файл или файлы подгружаются в программу, и когда в исходном коде программа доходит до места выполнения шейдерного файла, то в этот момент программа переключается на выполнение файла шейдеров.

Как только шейдерная программа выполнена, работа приложения опять возвращается к основному исходному коду программы. Но поскольку шейдеры очень «плотно» интегрируются в исходный код программы, то и выполнение шейдерных программ происходит достаточно часто и быстро. Таким образом, все приложение постоянно нагружает работой (в хорошем смысле этого слова) графический процессор видеокарты, минуя основной процессор компьютерной системы.

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

Вершинные и пиксельные шейдеры

Шейдерная программа – это исходный код, который располагается в одном файле. Несмотря на это, шейдерная программа незримо делится на две различные по своим направленностям части, которые выполняются строго друг за другом. Первая часть программы работает исключительно с вершинами объектов, поэтому и носит название вершинный шейдер. После того как определенные операции над вершинами были сделаны, в работу включается часть программы, отвечающая за работу с пикселями, или пиксельный шейдер.

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

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

Оба шейдера связаны друг с другом неразрывно, и очередность их выполнения одна: сначала в работу включается вершинный шейдер, а затем пиксельный шейдер.

Разновидности шейдерных моделей

Унифицированная шейдерная модель, известная в Direct3D 10 как Shader Model 4.0, использует согласованный (схожий) набор команд для всех типов шейдеров.[1] Шейдеры всех типов имеют очень похожие возможности — они могут «читать» текстуры, буферы данных и выполнять тот же самый набор арифметических инструкций.

Однако, набор команд не полностью одинаковый во всех типах шейдеров; например, только пиксельный шейдер может читать текстуры с неявными координатными градиентами; и только геометрический шейдер может производить рендеринг дополнительных примитивов, и т.д.[1]

Ранние шейдерные модели (Shader Model 1.x) использовали очень разные наборы команд для вершинных и пиксельных шейдеров, где вершинные шейдеры имели намного более гибкий набор команд. Более поздние шейдерные модели (2.x и 3.0) всё более сокращали различия, что и привело к унифицированной шейдерной модели.

Унифицированная шейдерная архитектура

Когда графический процессор поддерживает унифицированную шейдерную модель, то имеет смысл проектировать его вычислительные блоки так, чтобы любой из этих блоков мог выполнить любой тип шейдера. Когда вычислительные блоки графического процессора «унифицированы», то есть способны выполнять любой тип шейдерной программы, то это и называется «Унифицированная шейдерная архитектура». Чаще всего такие графические процессоры составлены из массива вычислительных блоков и блоков динамического планирования/баланса загрузки, для распределения выполнения шейдерных программ между всеми вычислительными блоками.

Аппаратное обеспечение не обязано иметь унифицированную шейдерную архитектуру для поддержки унифицированной шейдерной модели, и наоборот. Графические процессоры с поддержкой Direct3D 10 всё ещё могут иметь выделенные геометрические, вершинные и пиксельные процессоры. Технологически более ранние графические процессоры с поддержкой Shader Model 3.0 также могут частично выполнять унифицированную шейдерную модель, что видно на примере графического процессора Xenos для игровой консоли Xbox 360.

Унифицированная шейдерная архитектура позволяет более гибко использовать ресурсы графического процессора.[2] Например, в условиях с симуляцией тяжелой геометрии уровня унифицированная шейдерная архитектура может задействовать все блоки графического процессора для вычисления вершинных и геометрических шейдеров. И наоборот; когда геометрия не является сложной, а симулируется множество сложных пиксельных эффектов, таких как Parallax occlusion mapping, система частиц и т.д., все вычислительные блоки могут быть направлены на выполнение пиксельных шейдеров.

Презентация шейдерной модели 6.0

Унифицированную шейдерную архитектуру поддерживают графические процессоры начиная из таких серий:

Будущее шейдерных моделей

Сравнение шейдерных моделей разных поколений (слайд презентации)

Ключевым компонентом API Direct3D является так называемая Shader Model: от её воплощения и версии зависят возможности, доступные разработчикам игр. Последней на сегодня версией является Shader Model 5.0, остающаяся практически неизменной со времён начала внедрения DirectX 11 в 2009 году. Но для DirectX 12 и будущих приложений нужен новый подход. Microsoft понемногу раскрывает его тайны.
Новая шейдерная модель получила версию 6.0, что вполне закономерно. В сравнении с предыдущей версией она обеспечивает оптимальный путь шейдерного кода к финальной стадии — «железу», то есть графическому процессору. Предыдущая версия полагается в плане компиляции и оптимизации кода HLSL на офлайновый компилятор FXC и поддерживает версии HLSL с v1.4 до v5.1 включительно.
Shader Model 6.0 возлагает задачу первичной компиляции HLSL на транслятор Clang, а оптимизация кода осуществляется в несколько проходов на LLVM (Low Level Virtual Machine). Поскольку поддерживается HLSL-код версий 5.0 и выше, от внедрения Shader Model 6.0 могут выиграть существующие приложения DirectX 11 и DirectX 12. Игры и программы, использующие более ранние версии API, продолжат использовать путь Shader Model 5.0. Как будет внедряться новая шейдерная модель, пока не известно.

Литература

  1. 1,0 1,1 "Common Shader Core (DirectX HLSL)". Microsoft. Archived from the original on 2012-04-04. Retrieved 2008-08-17. 
  2. "GeForce 8800 GTX: 3D Architecture Overview". ExtremeTech. Archived from the original on 2006-11-11. Retrieved 2008-08-17.