Здавалка
Главная | Обратная связь

Архитектура DirectX10



Давайте рассмотрим компоненты графического конвейера DirectX, общая схема которого приведена на следующем рисунке:

Input Assembler Stage — блок, отвечающий за поставку графических данных в конвейер, например, константы, треугольники и/или цвета конкретных точек. Задача этого блока — собрать входные данные от программы и сформировать всю информацию в «примитивы» (элементарные конструкции, которые могут обрабатываться в других блоках). По сути, он формирует информацию для более удобной работы последующих блоков, в частности «шейдерных», то есть GS, VS и PS.

Vertex-Shader Stage (VS) отвечает за преобразование каркасов объектов. В игре все действующие лица и статичные объекты хранятся в памяти в виде каркасов с ячейками треугольной формы (как будто на каждый объект накинута паутина). Перед выводом каждого кадра необходимо спроецировать эти каркасы на плоскость экрана в зависимости от того, куда направлен взгляд игрока в данный момент. Плюс в таких объектах, как вода, деревья, персонажи игры, каркасы не являются постоянными, и нуждаются в перестраивании для каждого кадра (листья колышутся, по воде идут волны) по особой программе, называемой вершинным шейдером. Взгляните на следующий рисунок:

На нем демонстрируется элементарное преобразование двух треугольников по четырем вершинам: у двух треугольников всего шесть вершин, но так как две из них совпадают, то получаем четыре. Преобразование состоит в расчете координат каждой вершины, что может быть как элементарным действием (например, для статичного объекта), так и очень сложным — например, для разрушаемых объектов, передачи мимики персонажей, детального изображения структуры кожи или шерсти; реалистичность воды в играх тоже создается с использованием вершинного шейдера.

Geometry-Shader Stage (GS) — геометрический шейдер, который в отличие от вершинного может не только проводить операции над треугольниками, но и генерировать на выходе новые (используя смежные грани треугольников) и удалять существующие. GS, получив на входе один треугольник, способен сгенерировать на выходе один преобразованный и/или раздробить его на большее количество новых примитивов. В частности, вместо увеличения размеров треугольников в нашем примере, можно было бы увеличить их количество вдвое, оставив размеры каждого минимальными, что для наблюдателя проявилось бы в более детальной передачи складок кожи и повышении общей четкости изображения.

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

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

Геометрический шейдер, пожалуй, — ключевое нововведение DirectX 10, появление которого можно считать новым шагом в развитии компьютерной графики, сравнимым с появлением вершинных и пиксельных шейдеров.

Stream Output Stage разработан для переброски простых данных из графического конвейера в память. В задачу блока входит увеличение скорости работы приложений за счет уменьшения потерь времени при загрузке данных, уже имеющихся в памяти видеокарты, и обеспечение более тесного взаимодействия между центральным и графическим процессорами, что может быть полезно, в частности, для физических и прочих «неграфических» вычислений. Подчеркнем, что этот блок, как и GS, впервые появился в DirectX10.

Rasterizer Stage — стадия, при которой происходит отсечение невидимых примитивов. Это необходимо для экономии ресурсов системы. Например, в кадр попало детализированное здание с внутренними помещениями, однако, поскольку мы в данный момент находимся снаружи, совсем необязательно рассчитывать ежесекундно каркасы этих помещений — достаточно показать внешний вид дома. Именно на этой стадии мы получаем на данный момент времени готовый для отображения на экране каркас всех объектов, который предстоит «растеризовать», то есть покрыть текстурами — кусочками простых (растровых, состоящих из пикселей) изображений поверхностей, кожи, листьев, камня и т.п.

Pixel-Shader Stage (PS) — на этой стадии исполняются пиксельные шейдеры, программы, которые могут управлять любыми пикселями в примитиве, то есть если у нас есть треугольник, на который натянута текстура, мы можем применить для любого из пикселей, входящих в этот треугольник, свой цвет, яркость и/или прозрачность. Благодаря PS, стало возможным управление каждым пикселем в сцене. Самый заметный эффект, появившийся в играх с приходом PS — это перелив света (блеск) на округлых поверхностях при смене либо угла просмотра, либо позиции источника света. Поддержка PS появилась еще в DirectX 8 и от версии к версии происходит усложнение допустимых преобразований, которые позволяют получать все более сложные эффекты.

Output Merger Stage — финальный этап, на котором определяется, какие пиксели и в каком порядке выводить на экран. После отсечения невидимых примитивов аналогичную операцию надо провести на уровне пикселей — вполне возможно, что на границах объектов, треугольники, принадлежащие каркасам разных объектов, перекрываются лишь частично, и на экран надо вывести изображение того объекта, который находится ближе к наблюдателю. Этот вопрос решается с помощью так называемого Z-буфера, в котором хранятся координаты глубины всех точек изображения.

Direct X 11

В D3D11 добавляется 3 дополнительных стадии конвейера визуализации, целью введения которых является эффективная тесселяция поверхностей.

Конвейер D3D11 включает три новых стадии между стадиями вершинного и геометрического шейдера. Две из них являются программируемыми (стадии оболочечного (hull shader) и domain шейдеров) и одна — конфигурируемая (стадия тесселяции).

Представленный конвейер оперирует сетками, заданными поверхностными патчами. Основными примитивами D3D11 являются треугольные и квадратные патчи. Форма каждого патча определяется числом контрольных точек. В вершинном шейдере эти точки трансформируются, скинятся и (или) морфятся последовательно.

Оболочечный шейдер вызывается для каждого патча. В качестве входных данных используются контрольные точки патча из вершинного шейдера. Оболочечный шейдер имеет два основных применения. Первое (опционально) — это конвертирование контрольных точек из одного представления в другое. После этого шейдера контрольные точки пересылаются напрямую дальше, минуя тесселятор. Другое применение — вычисление подходящего параметра тесселяции, который затем передаётся на стадию тесселяции. Такой подход позволяет делать адаптивную тесселяцию, которая может быть использована в случае видозависимых уровней детализации (LOD). Параметр тесселяции определяется для каждой грани патча и варьируются в диапазоне от 2 до 64. Это означает, что каждая грань треугольного (или квадратного) патча может быть разбита на 2 (или максимум 64) грани.

Стадия тесселятора представлена фиксированным набором функции (хорошо конфигурируема), которые используют параметр тесселяции для подразбиения патча на несколько треугольников или квадов. Тесселятор не имеет доступа к контрольным точкам — все решения о разбиении принимаются на основе конфигурационных и тесселяционных параметров, передаваемых из оболочечного шейдера. Каждая вершина после стадии тесселяции передаётся в domain шейдер, причём передаются только координаты параметризации (parametrization coordinates).

Domain shader оперирует parametrization coordinates патча для каждой вершины раздельно, хотя имеется возможность получить доступ к трансформированным контрольным точкам для всего патча. Domain шейдер отправляет всю информацию о вершине (позицию, текстурные координаты, и т.п.) в геометрический шейдер (или на стадию клипирования, если геометрический шейдер не задан). По сути дела, он оценивает представление поверхности в каждой точке. На данной стадии может быть применён метод карт смещения (displacement mapping).







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.