Исследование и разработка методов нефотореалистичной визуализации для реализации графической библиотеки реального времени Часть 7

Технология шейдеров

Программа для вершинного процессора называется вершинным шейдером, а для пиксельного процессора – пиксельным шейдером. Грамотное использование шейдеров позволяет создавать потрясающие спецэффекты. Сегодня уже практически невозможно найти DirectX-приложения, не использующего шейдеры. Соответственно отсутствие поддержки шейдеров является серьёзным недостатком, на который незамедлительно обратят внимание «продвинутые» пользователи.

Поддержка шейдеров появилась в DirectX, начиная с 8-й версии. В DirectX 8 шейдеры имели множество ограничений на длину и программировались на низкоуровневом ассемблеро-подобном языке. В DirectX 9 возможности шейдеров значительно возросли. Одновременно появилась и необходимость в языках высокого уровня. Было создано несколько языков высокого уровня для написания шейдеров DirectX, однако стандартом де-факто стал язык HLSL, входящий в состав DirectX 9 [14].

Так язык HLSL тесно связан с архитектурой графического процессора, мы начнём эту главу с изучения основ архитектуры современного графического процессора.

Конвейер DirectX предоставляет собой последовательность стадий (простых операций), выполняемых над вершинами в определённом порядке (рисунок 19).

Рисунок 19. Упрощенная схема графического конвейера

1. Вначале вершины обрабатываются вершинным процессором. Программа, по которой вершинный процессор обрабатывает вершины, называется вершинным шейдером. На выходе из вершинного процессора получаются так называемые трансформированные (преобразованные) вершины. К вершинам могут быть «привязаны» различные параметры: цвет вершины, текстурные координаты и так далее. Координаты трансформированных вершин задаются в логической системе однородных координат, называемой clip space. В этой системе координат нижнему левому углу соответствует точка с координатами (-1, -1, 0, 1), правому верхнему углу экрана – (1, 1, 0, 1), а центру экрана – соответственно (0, 0, 0, 1).

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

3. Далее идёт сборка примитивов. На этой стадии вершины объединяются в примитивы.

4. Затем происходит растеризация примитивов – преобразование каждого примитива в набор пикселей экрана. Параметры внутренних пикселей примитива (например, цвет) определяются путём интерполяции соответствующих параметров вершин вдоль поверхности примитива. Благодаря этой интерполяции, при закраске треугольника с различными цветами вершин образуются красивые цветовые переходы.

5. Следующий этап обработка пикселей пиксельным процессором с использованием программы, называемой пиксельным шейдером. На вход пиксельному процессору подаются параметры пикселя (цвет, текстурные координаты и т.д.), полученные путём интерполяции соответствующих вершинных параметров вдоль поверхности примитива. После обработки входных параметров, пиксельный процессор возвращает цвет пикселя [10].

6. Полученные цвета пикселей заносятся в кадровый буфер.

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

Технология CUDA

CUDA (англ. Compute Unified Device Architecture) — технология, позволяющая программистам реализовывать на упрощённом языке программирования Си алгоритмы, выполнимые на графических процессорах ускорителей GeForce восьмого поколения и старше (GeForce 8 Series, GeForce 9 Series, GeForce 200 Series), Nvidia Quadro и Tesla компании Nvidia [11]. Технология CUDA разработана компанией nVidia.

Фактически, CUDA позволяет включать в текст программы на C специальные функции. Эти функции пишутся на особом диалекте С, и выполняются на графическом процессоре.

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

Вычислительная архитектура CUDA основана на понятии мультипроцессора и концепции одна команда на множество данных.

Особенностью архитектуры CUDA является блочно-сеточная организация, необычная для многопоточных приложений. При этом драйвер CUDA самостоятельно распределяет ресурсы устройства между потоками[8].

Рассмотрим вычислительную модель GPU более подробно.

  1. Верхний уровень ядра GPU состоит из блоков, которые группируются в сетку или грид (grid) размерностью N1 * N2 * N3. Это можно изобразить следующим образом:

    Рисунок 20. Вычислительное устройство GPU

    Размерность сетки блоков зависит от аппаратного ограничения графической карты.

  2. Любой блок в свою очередь состоит из нитей (threads), которые являются непосредственными исполнителями вычислений. Нити в блоке сформированы в виде трехмерного массива. Наглядно данное утверждение представлено на рисунке 21.

Рисунок 21. Устройство блока GPU

При использовании GPU можно задействовать грид необходимого размера и сконфигурировать блоки под нужды задачи разработчика.

CUDA включает два API: высокого уровня (CUDA Runtime API) и низкого (CUDA Driver API), хотя в одной программе одновременное использование обоих невозможно, нужно использовать или один или другой. Высокоуровневый работает «сверху» низкоуровневого, все вызовы runtime транслируются в простые инструкции, обрабатываемые низкоуровневым Driver API. Но даже «высокоуровневый» API предполагает знания об устройстве и работе видеочипов NVIDIA, слишком высокого уровня абстракции там нет [7]. Архитектура технологии CUDA представлена на рисунке 22.

Рисунок 22. Архитектура технологии CUDA

Выбор технологии для написания графической библиотеки реального времени

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

Преимущество этого подхода состоит в том, что модель памяти технологии CUDA включает несколько типов памяти, в том числе разделяемую память и константную память. Разделяемая память (shared memory) является внутрипроцессорной, поэтому скорость доступа к ней намного выше, чем к глобальной памяти. Каждому блоку потоков выделяется определенное количество разделяемой памяти. Константная память оптимизирована для доступа на чтение. Этот тип памяти кэшируемый, что в среднем ускоряет чтение данных, находящихся в константной памяти. Наличие этих двух типов памяти позволяет ускорить выполнение алгоритмов, требующих большого количества обращений к памяти [15].

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

У данной технологии есть существенный недостаток. NVidia CUDA поддерживается только на видеокартах серии 8 фирмы NVidia.

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

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

Кроме того, существует ряд ограничений на формат результирующей текстуры в пиксельных шейдерах. Например, при использовании пиксельных шейдеров совместно с DirectX9.0 под управлением ОС Windows ХР формат текстуры, в которую производится отрисовка, строго регламентирован, а однобитовый формат не поддерживается. Поэтому часто приходится передавать из памяти видеокарты в оперативную память в несколько раз больше данных, чем необходимо. Технология шейдеров постоянно развивается и на сегодняшний момент существует версия 4.0.

Отличия пиксельных шейдеров 2.0 от версии 3.0 (наиболее существенные при выполнении вычислений общего назначения):

  1. Шейдеры 3.0 поддерживают значительно большее число слотов инструкций и выполняемых инструкций по сравнению с версией 2.0;
  2. В версии 3.0 по умолчанию все операции выполняются с максимальной точностью (не ниже 32 бит)

    Отличия щейдеров версии 4.0 от 3.0 (наиболее существенные при выполнении вычислений общего назначения) [6]:

  3. в версии 4.0 целые числа (int и uint) отображаются в 32-битовые целые числа на видеокарте, тогда как в 3.0 и более ранних версиях пиксельных шейдеров целые числа отображаются в вещественные числа на видеокарте (например, при передаче в шейдер текстуры, цвета пикселей которой закодированы целыми числами);
  4. в отличие от версии шейдеров 3.0, в 4.0 имеются побитовые операторы для целых типов int и uint.

    Таким образом, с возрастанием версии пиксельных шейдеров наблюдается расширение возможностей для выполнения вычислений общего назначения. Отметим, что программируемые конвейеры Direct3D (в том числе и Direct3D 10) проектировались для отрисовки изображений, что значительно сужает их область применения для общих вычислений, но зато делает гораздо удобнее для работы с графикой [15].

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

Реклама
Запись опубликована в рубрике Диплом. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s