Архитектура ГП на примере ATI Radeon X1800
Рассмотрим также, к примеру, процесс формирования изображения в графическом процессоре ATI Radeon X1800 (Рисунок 3).
Рисунок 3 – Схема графического процессора ATI Radeon X1800
Первый этап вполне традиционен — это обработка данных вершинными процессорами, которые вычисляют геометрию трехмерного изображения. На этом этапе данные обрабатываются восемью вершинными процессорами.
После расчета геометрии вершин, отсечения скрытых поверхностей, обрезки и т.д. данные поступают в блок сборки, содержащий блок растеризации геометрии, потом — в процессор распределения данных. Именно этот новый блок распределения позволяет говорить о мультипоточной концепции архитектуры графического процессора. Процессор распределения способен распараллеливать шейдерный код на сотни потоков (до 512 потоков), увеличивая эффективность выполнения пиксельных шейдеров.
После прохождения процессора распределения потоки поступают в пиксельные блоки. Каждый такой блок (всего в графическом процессоре их четыре) состоит из четырех объединенных вместе пиксельных процессоров, каждый из которых в состоянии обработать шейдер для блока 2x2 пикселей за такт. Соответственно пиксельный блок может обрабатывать шейдер для блока 4x4 пикселей за такт.
Хотя проблема оптимального распределения нагрузки между отдельными блоками GPU в архитектуре процессора ATI Radeon X1000 решена, данная архитектура не позволяет избавиться от еще одного недостатка конвейерной архитектуры GPU. Нередко возникает ситуация, когда уже частично обработанные данные необходимо изменить. Для этого приходится дожидаться завершения всего процесса конвейерной обработки данных, при котором конвейер работает впустую, обрабатывая данные, которые все равно придется изменять и обрабатывать повторно.
Недостатки конвейерной обработки данных в графических процессорах можно было бы решить, перейдя к архитектуре унифицированных процессоров, то есть когда не существует отдельных вершинных или пиксельных процессоров, а есть процессоры общего назначения, способные исполнять как вершинные, так и пиксельные шейдеры. Естественно, что для унифицированных процессоров потребуются и новые программы обработки, то есть шейдеры. Унифицированные процессоры поддерживаются в API DirectX (начиная с версии 10).
Шейдеры
Шейдер — это программа для одной из ступеней графического конвейера, используемая в трёхмерной графике для определения окончательных параметров объекта или изображения. Она может включать в себя произвольной сложности описание поглощения и рассеяния света, наложения текстуры, отражение и преломление, затенение, смещение поверхности и эффекты пост-обработки.
Программируемые шейдеры гибки и эффективны. Сложные с виду поверхности могут быть визуализированы при помощи простых геометрических форм.
Эволюция шейдеров
Впервые технология шейдеров была представлена компанией Pixar в проекте RenderMan в 1989 году, однако применение этой технологии было наглядно показано только в 1995 году в мультипликационном фильме Toy Story.
Первые шейдеры не имели полной аппаратной реализации и исполнялись совместно на CPU и GPU. Весь процесс обработки изображения делился на шесть частей, каждая из которых использовала свой отдельный тип шейдера. Это были шейдеры источников света (light shader), шейдеры поверхностей (surface shader), деформирующие шейдеры (displacement shader), шейдеры объёма (volume shader), шейдеры трансформаций (tramsformation shader) и шейдеры отображения (imager shader). Для разработки шейдерных программ компанией Pixar был разработан собственный язык Pixar Shading Language. Но без аппаратной поддержки он не представлял особо интереса, так как не был пригоден для визуализации изображений в реальном времени.
Первые графические процессоры с аппаратной поддержкой официального стандарта шейдеров (Shader Model 1.0/1.1 ) появились лишь в 1998 году в семействе GPU GeForce 256 (NV10), выпущенных корпорацией NVIDIA. Но возможности данного GPU были крайне малы, и их кое-как хватало на визуализацию простейших эффектов. К тому же, шейдеры первой версии являлись сугубо линейными и простыми программами. В них не было ни функций, ни структур, ни даже условных переходов, без которых, по сути, невозможно построить сколько-нибудь сложный алгоритм. Набор поддерживаемых инструкций так же был невелик. Помимо этого на шейдерную программу накладывался ряд крайне жестких ограничений. К примеру, в Shader model 1.1 вы не могли написать код длиннее, чем 8 базовых инструкций.
Ситуация заметно улучшилась с выпуском GeForce3 (NV20), появившемся на прилавках в 2001 году. Но настоящий прорыв в сфере производства программируемых GPU произошел в 2002 году, ознаменовавшемся выпуском плат семейства GeForce FX от NVIDIA и Radeon 9500 от ATI (была куплена AMD в 2006 году). Это были первые GPU, поддерживающие шейдеры второй версии (Shader Model 2.0). Данная модель подразумевала возможность выполнять на GPU куда более сложные программы. Существенно увеличился лимит на количество команд в программе (64 базовые инструкции), а также на максимальное число обращений к текстурам. Во второй версии шейдеров появилась поддержка условных переходов, функций и структур. Именно с этого момента времени можно говорить о возможности использования графического процессора для решения задач общего назначения .
Разумеется, развитие шейдеров не остановилось с выходом Shader Model 2.0. В Shader Model 3.0 была добавлена возможность динамических переходов в вершинных и пиксельных шейдерах, возможность выборки текстур из вершинных шейдеров, что существенно расширило возможности по их применению. Так же была увеличена максимальный размер шейдера и добавлена поддержка циклов.
В версии шейдеров Shader Model 4.0 число констант и количество инструкций в шейдерной программе почти не лимитированы, а вложенность текстурных выборок уже не ограничивается, как это было во второй версии. Основным нововведением Shader Model 4.0 являются геометрические шейдеры (Geometry Shader), которые занимаются обработкой графических примитивов (точки, линии и треугольники) полученных после выполнения вершинного шейдера.
Последней версией шейдеров является Shaders Model 5.0, которая вошла в состав графического API DirectX 11,однако на данный момент эта версия шейдерной модели поддерживается лишь небольшим количеством приложений. В Shaders Model 5.0 введен новый тип шейдера - вычислительный шейдер (Compute Shader), который существенно расширил функциональные возможности графического процессора. Вычислительный шейдер вызывается как регулярный массив потоков. Потоки делятся на группы. Каждая из групп имеет по 32 килобайта памяти, разделяемой между потоками группы. Таким образом, потоки могут в рамках одной группы обмениваться между собой результатами вычислений. Также потоки могут производить чтения и записи с произвольным доступом к графическим ресурсам: текстурам, массивам вершин, и целям визуализации. Вызов вычислительного шейдера заменяет все стадии конвейера визуализации. Тем не менее, можно смешивать вычислительные шейдеры и традиционный графический конвейер путём использования их результатов.
Типы шейдеров
В настоящее время шейдеры делятся на три типа: вершинные, геометрические и пиксельные.
Вершинный шейдер оперирует данными, сопоставленными с вершинами многогранников. К таким данным, в частности, относятся координаты вершины в пространстве, текстурные координаты, тангенс-вектор, вектор бинормали, вектор нормали. Вершинный шейдер может быть использован для видового и перспективного преобразования вершин, генерации текстурных координат, расчета освещения и т. д.
Геометрический шейдер, в отличие от вершинного, способен обработать не только одну вершину, но и целый примитив. Это может быть отрезок (две вершины) и треугольник (три вершины), а при наличии информации о смежных вершинах может быть обработано до шести вершин для треугольного примитива. Кроме того геометрический шейдер способен генерировать примитивы «на лету», не задействуя при этом центральный процессор. Впервые начал использоваться на видеокартах Nvidia серии 8.
Фрагментный (пиксельный) шейдер работает с фрагментами изображения. Под фрагментом изображения в данном случае понимается пиксель, которому поставлен в соответствие некоторый набор атрибутов, таких как цвет, глубина, текстурные координаты. Пиксельный шейдер используется на последней стадии графического конвейера для формирования фрагмента изображения.
Вершинные шейдеры
Вершинным шейдером называется программа, под управлением которой происходит обработка данных в вершинном процессоре. Вершинные шейдеры производят математические операции с вершинами, то есть предоставляют возможность выполнять программируемые алгоритмы по изменению параметров вершин и их освещению. Каждая вершина в 3D-модели определяется тремя координатами — X, Y и Z. Вершины также могут быть описаны характеристиками цвета, текстурными координатами и т.п. Вершинные шейдеры, в зависимости от алгоритмов, изменяют эти данные в процессе своей работы, например, вычисляя и записывая новые координаты и цвет. То есть, входные данные вершинного шейдера - данные об одной вершине геометрической модели, которая в данный момент обрабатывается. Обычно это координаты в пространстве, нормаль, компоненты цвета и текстурные координаты. Результирующие данные выполняемой программы служат входными для дальнейшей части конвейера, растеризатор делает линейную интерполяцию входных данных для поверхности треугольника и для каждого пикселя исполняет соответствующий пиксельный шейдер.
Примеры того, как и где применяются вершинные шейдеры:
· Скининг (skinning). Matrix pallete skinning для скелетной анимации персонажей с большим количеством "костей".
· Деформация объектов. Как самый явный и эффектный пример - создание реалистичных волн в динамике.
· Анимация объектов. Например, травы и деревьев.
· Toon shading/Cel shading. Используется в некоторых играх для создания специального эффекта "мультяшного" изображения.
· Имитация ткани (Cloth Simulation) - для имитации поведения подобных ткани материалов.
Дата добавления: 2016-04-14; просмотров: 1514;