logo
Методичка

12.3 Шейдерный процессор

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

Ускорить эти вычисления можно путём разбиения их на стадии, которые выполняются текстурными модулями и распараллеливания на пиксельные конвейеры. На каждой стадии каждый пиксельный конвейер просчитывает очередной пиксель конечного изображения. К примеру, если используется десять пиксельных конвейеров, то первый конвейер обрабатывает 1‑й, затем 11‑й, затем 21‑й пиксель и т.д.; второй конвейер – 2‑й, 12‑й, 22‑й соответственно. Каждый пиксельный конвейер (рис.12.1) состоит из нескольких модулей адресации текстур (TA) и нескольких модулей фильтрации текстур (TF). Пиксельные конвейеры образуют пиксельный шейдер.

Шейдер (Shader) – средство закрашивания полигона. Шейдер может быть реализован как полностью программно (так делалось в XX веке – с помощью центрального процессора), так и программно-аппаратно – как это делается сейчас в шейдерных процессорах.

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

Разработчики программного обеспечения для визуализации трёхмерного изображения используют, как правило, одну из графических библиотек – Direct 3D или Open GL. В них описаны стандарты для работы с трёхмерными изображениями. Прикладная программа вызывает определённую функцию Open GL или Direct 3D, а шейдерный процессор эту функцию выполняет в несколько этапов. На рис.12.2 изображён процесс конвейерного расчёта трёхмерного изображения в весьма упрощённом виде.

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

На втором этапе вершинный шейдер рассчитывает геометрию сцены: координаты точки обзора; сколько, где и какого цвета источники света и их диаграммы направленности; расположение и ориентация объектов на сцене. Определяющими характеристиками вершинного шейдера являются максимальное количество источников света и количество обрабатываемых полигонов. Результатом работы вершинного шейдера является прозрачная каркасная модель сцены, включающая все вершины и рёбра всех объектов, а также координаты источников света и их характеристики.

На третьем этапе происходит отсечение тех полигонов каркасной модели, которые невидимы с точки обзора. Эту работу выполняет Z-буфер. Результатом его работы является видимая каркасная модель – это изображение с хорошо различимыми объектами, которые пока не раскрашены.

На четвёртом этапе происходит рендеринг – все полигоны видимой каркасной модели заливаются соответствующим текстурами. Этим занимается пиксельный шейдер, простейшая структурная схема которого была рассмотрена нами выше (рис.12.1). Кроме рендеринга текстурные модули пиксельного шейдера выполняют сглаживание и фильтрацию текстур. Чем больше параллельных пиксельных конвейеров содержит GPU и чем больше текстурных модулей содержит каждый пиксельный конвейер, тем быстрее пиксельный шейдер рассчитывает цвета всех текселей. Результатом четвёртого этапа является готовая к выводу на экран текстурированная модель сцены.

На последнем этапе конвейерной обработки текстурированная сцена передаётся в буфер кадров видеоОЗУ, где осуществляется двойная буферизация.