4.2.Понятие графического конвейера В данном разделе, перед тем как перейти к деталям рендеринга, мы рассмотрим графический конвейер в целом. Его можно записать в виде следующего псевдокода.
Для всех треугольников в примитиве
{
1. Обработать на вершинном конвейере три вершины треугольника
2. Произвести клиповку треугольника пирамидой видимости (клиповка
обычно осуществляется в проективном пространстве до перспективного
деления)
3. В случае если после клиповки треугольник все еще существует, то
начать его растеризацию
4. Для всех пикселов в треугольнике (растеризация)
{
if (Z-тест пройден) // т.н. ранний z-тест
{
Обработка пиксела в пиксельном конвейере (в результате получено
значение цвета (color))
if (aльфа-тест пройден)
{
if (включено смешивание с буфером кадра)
цвет в буфере кадра = f(цвет в буфере кадра, color)
else
цвет в буфере кадра = color
} // конец альфа-теста
} // конец z-теста
} // конец цикла по пикселям
} // конец цикла по треугольникам
Данный псевдокод является упрощением реального графического конвейера, который содержит гораздо больше разветвлений и оптимизаций. Однако описанной модели достаточно для того, чтобы выделить основные этапы:
обработка вершин (вершинный конвейер),
клиповка и растеризация треугольников
обработка каждого пикселя треугольника в сочетании с рядом тестов, позволяющих не ставить пиксель в буфер кадра (пиксельный конвейер).
Из этих этапов программируемыми являются первый и последний. Клиповка и растеризация производятся как бы по умолчанию6. В Direct3D 9.0c существует два способа программирования вершинного и пиксельного конвейера: фиксированный и шейдерный. Последний позволяет писать небольшие программы, обрабатывающие вершины и пиксели, однако для ознакомления с библиотекой достаточно фиксированного конвейера, который и будет рассматриваться далее (вершинный – в разделах 4.3, 5, 6.2, 6.3, а пиксельный – в разделе 6.5). Управление различными тестами также будет рассмотрено ниже (см. разделы 4.5, 7.1 и 7.2).
4.3.Преобразования системы координат в вершинном конвейере Теперь, когда у нас достаточно информации о том, как создавать и хранить данные о поверхности объекта, перейдем к его рендерингу. Для этого следует в первую очередь вспомнить, что 3D координаты вершины заданы в некоторой системе координат, которая называется локальной системой координат объекта7 (задается матрицей W). Чтобы получить позицию вершины объекта в мировой системе координат следует умножить ее на W. Так как визуализация осуществляется для какого-то наблюдателя (далее, камеры), то следует преобразовать позиции вершин в систему координат камеры (задается матрицей C). Однако так как позиция преобразуется из мировой в камерную систему координат, а не наоборот, то вектор позиции следует умножать на матрицу обратную камерной.
Чтобы получить точку в экранной системе координат следует спроецировать позицию вершины. Для этого позиция умножается на матрицу проецирования (P) и после этого делится на w-компоненту получившегося результата. В х и y компонентах получаются экранные координаты в интервале [-1,1] x [-1,1], в z – Z-буферная величина в интервале [0,1].
Описанные действия математически записываются так
,
где - позиция вершины в локальной системе координат.
Матрицы W, C-1 и P задаются с помощью метода SetTransform() со значениями первого параметра D3DTS_WORLD, D3DTS_VIEW, D3DTS_PROJECTION соответственно.
Остановимся более подробно на вычислении матрицы C-1. Так как главный минор 3х3 матрицы камеры является ортонормированной матрицей, то
.
Здесь вектора, ,- оси камерной системы координат заданные в мировой системе координат, а - начало координат (позиция камеры) в этой же системе.
Матрица P для наиболее распространенного случая перспективного проецирования имеет вид
,
где Ax, Ay – углы раствора пирамиды видимости, а zn и zf – ближняя и дальняя границы клиповки соответственно (см. рис. 5).
Рис. 5. Параметры пирамиды видимости. Следует обратить внимание на то, что отношение тангенсов половинных углов раствора пирамиды видимости должно быть синхронизировано с размерами окна визуализации. В противном случае будут возникать искажения пропорций объекта – сфера будет казаться эллипсоидом и т.д. Чтобы такого не возникало, должно выполняться следующее соотношение
,
где W, H – ширина и высота окна вывода (заданного методом SetViewport()), Asp – так называемое форматное соотношение (aspect ratio) равное, например, для мониторов и стандартных телевизоров – 4:3, и 16:9 для широкоэкранных телевизоров.
|