|
|||||
Базовые графичеcкие концепцииЭтот туториал представляет собой вольный пересказ раздела MSDN - DirectX Media SDK, смешанным с другими источниками и обильно приправленный моими собственными мыслями, которые либо помогут вам все понять, либо до безобразия все испортят :-) О чем здесь пойдет речь? Я хочу объяснить базовые основы "трехмерного" программирования, как они есть на сегодняшний день. Эта статья открывает новую мою серию - Direct3D:RM. О чем она - читайте во вступлении. Прежде всего, все нижеследующее предназначено для того, кто только подходит к программированию 3D графики. Если вы не знаете с чего начать, вам обязательно надо прочитать эту статью, потому что в ней описаны знания, которые просто необходимы для того, чтобы начать программировать трехмерную графику. Если же вы уже знакомы с программированием 3D-графики под другие API, все равно просмотрите эту стаью, потому-что чтото в D3D:RM может отличаться от того, что вы знаете. Итак, хватит болтовни и переходим к делу! Все, что тут есть, разбито на такие вот пункты:
Система 3D-координатВсе вы прекрасно знаете из школьной геометрии о картезианской координатной системе. Где существуют оси X (горизонтальная) и Y (вертикальная). Начало координат находится в месте пересечения этих осей, ось X направлена вправо, а ось Y - вверх. Трехмерная картезианская система добавляет к этим двум осям еще одну - ось Z. Лучше всего это иллюстрирует рисунок чуть пониже.
В Direct3D положительное вращение происходит по часовой стрелке вокруг какой-либо из осей, обращенных к наблюдателю. Direct3D также может использовать U- и V- координатную систему. Она также известна под названием текстурная координатная система. Она называется так, потому что используется при наложении текстур на объект. Вектор V описывает направление о ориентацию текстуры и лежит вдоль оси Z. Вектор U (или верхний вектор) обычно лежит вдоль очи Y с началом в [0,0,0]. Большей информации об этой координатной системе нам пока не потребуется. 3D-трансформацииТрехмерные трансформации - это базовые действия, которые вы производите с объектами. Они выражают местонахождение объекта, относительно других объектов; вращение, движение, изменение размеров объектов; изменение позиции обзора, направления и перспективы. Вы трансформируете любую точку в другую точку, используя матрицу 4x4. В следующем примере, матрица используется для переопределения точки (x, y, z) в новую точку (x', y' z'): Что происходит при такой операции? Происходят вот такие вычисления: Самые частые матрицы преобразования - это матрицы перемещения, вращения и изменения размера. Вы можете комбинировать эти матрицы для получения одной матрицы, совершающей сразу несколько таких действий. Например, вы можете создать матрицу для одновременного перемещения и вращения набора точек. Хотя матрицы визуально выглядят как двухмерные массивы, на самом деле
тип D3DMATRIX (так эти матрицы задаются) представляет собой простой массив
из 16 членов. Членами этого типа в VisualBasic являются элементы single,
так что не путайте с элементами D3DVALUE из С++
Следующие матрицы применяются для проведения трансформаций точек: ПеремещениеЭта матрица перемещает точку (x, y, z) в новую точку (x', y', z') ВращениеСледующие матрицы определены для системы левой руки и могут отличаться от того, что вы видели раньше. Эта матрица вращает точку (x, y, z) вокруг оси X и получает новую точку (x', y', z') Эта матрица вращает точку вокруг оси Y Это матрица для вращения точки вокруг оси Z Греческая фи обозначает угол вращения, указанный в радианах. Вращение происходит по часовой стрелке вокруг оси. Изменение масштабаЭта матрица изменяет масштаб точки (x, y, z), по направляющим x-, y-, z- переводя ее в новое место (x', y', z') МногоугольникиТрехмерные объекты в Direct3D состоят из объединений. Объединение - это набор поверхностей, каждая из которых представляет собой простой многоугольник. Основной многоугольник - это треугольник. Хоть RM приложения и могут указывать многоугольники с более чем тремя вершинами, система все равно переводит эти фигуры в треугольники перед тем как отрендерить объект. А вот IM приложения должны всегда использовать треугольники. Далее я рассмотрю использование многоугольников в наших приложениях: Требования к геометрии:Треугольники - самый предпочтительный тип многоугольника, потому-что они всегда выпуклые и они всегда плоские - два требования рендера к многоугольникам. Многоугольник является выпуклым, если линия, проведенная между двумя любыми точками многоугольника будет находиться внутри него. Три вершины многоугольника всегда образуют плоскость, но легко создать неплоский многоугольник, добавив еще одну вершину. Поверхности и векторы нормалиКаждая поверхность в объединении имеет перпендикулярный поверхности вектор нормали, чье направление определяется порядком, в котором установлены вершины, а также типом координатной системы - правой или левой руки. Если вектор нормали указывает на обозревателя, то эта сторона поверхности - передняя. В Direct3D только передняя сторона поверхности видима. Передней стороной является сторона, в которой вершины определены по порядку часовой стрелки.
Приложениям Direct3D не надо указывать поверхности нормали; система вычисляет их автоматически по мере необходимости. Система использует поверхности нормали в плоском затенении. Для затенения по методу Фонга или Гуро, а также для контроля освещения и текстурных эффектов, система использует вершины нормали. Режимы затененияВ плоском режиме затенения (затушевывания) система дублирует цвет одной вершины на другие поверхности примитива. В режимах затенения Гуро и Фонга для придания гладкого вида объекту используются вершины нормали. В затенении по методу Гуро цвет и интенсивность находящихся рядом фершин интерполируется по разделяющему их пространству. В затенении по методу Фонга система вычисляет подходящие значения затенения для каждого пиксела поверхности. Примечание: Метод Фонга в настоящее время не поддерживается В плоском режиме затенения показанная пирамида будет отображена с четкой границей между соседними вершинами; система будет генерировать автоматические поверхности нормали. В режимах Гуро или Фонга значения затенения будут интерполироваться через вершину и в конечном счете мы увидим кривую поверхность. Если вы хотите использовать режимы Гуро или Фонга для отображения кривых поверхностей и вы также хотите включить несколько объектов с четкими гранями, вашему приложению необходимо будет дублировать вершины нормали в пересечении поверхностей, где нужна четкая грань, как показано на следующей иллюстрации.
В добавок к тому, что метод Гуро позволяет делать кривые поверхности, он еще и более правильно отображает свет, падающий на поверхность. Поверхность в плоском режиме затенения выглядит однородным цветом. Зато метод Гуро позволяет свету распределяться по поверхности правильно. Это различие особенно очевидно, когда поблизости от поверхности находится точечный источник света. Метод гуро является более предпочтительным методом затенения для большинства Direct3D приложений, однако он требует больших вычислений, а соответственно и тормозит программу. Интерполируемые характеристики треугольникаСистема интерполирует характеристики вершин треугольника на треугольнике, когда происходит рендеринг поверхности. Интерполируются следующие характеристики: Цвет Все интерполируемые характеристики треугольника изменяются текущим режимом затенения: Плоский: Нет интерполяции. Вместо этого цвет первой вершины в
треугольнике применяется на всей поверхности. Интерполирование цветовой характеристики и характеристики отражения происходит по разному, в зависимости от цветовой модели. в модели RGB (D3DCOLOR_RGB) система использует красную, зеленую и синюю компоненту в интерполяции. В монохромной модели (D3DCOLOR_MONO) система использует только синюю компоненту цвета вершины. Например, если красная компонента цвета вершины 1 была 0.8 и красная компонента вершины 2 была 0.4, то в режиме Гуро и модели цвета RGB точка находящаяся в середине между этими вершинами при интерполяции будет иметь красную компоненту 0.6 Альфа компонента цвета обрабатывается, как отдельная интерполируемая характеристика, потому что драйвер устройства может осуществлять эффект прозрачности двумя разными способами: используя смешение текстур или используя стипплинг (stippling). Приложение может использовать член lShadeCaps структуры D3DPRIMCAPS для определения какой способ интерполяции поддерживает текущее устройство.
Ленты треугольников и веера треугольниковВы можете использовать ленты треугольников и веер треугольников чтобы указать целую поверхность без указания всех трех вершин для каждого треугольника . Например, требуются только семь вершин для определения такой ленты треугольников: Система ипользует вершины v1, v2 и v3 для того, чтобы нарисовать первый треугольник; v2, v4 и v3 для второго и так далее. Обратите внимание, что все треугольники должны быть нарисованы в порядке часовой стрелки. Веер треугольников похож по структуре на ленту треугольников, но здесь много треугольников используют одну общую вершину. Система использует вершины v1, v2, v3 для того, чтобы нарисовать первый треугольник; v1, v3, v4 для второго и так далее... Z-буфера и оверлеиОверлеи находятся сверху всех других компонентов экрана (обычно их используют для отображения жизней, энергии и т.п. в играх). Порядок в z-буферах определяет порядок, в котором оверлеи перекрывают друг друга. Оверлеи, не имеющие указанного z-порядка (порядка, в котором они перекрывают друг друга) ведут себя совершенно непредсказуемо, когда покрывают одну и ту же часть главной поверхности. Direct3D:RM не сортирует оверлей, если у вас нет z-буфера. Оверлеи без указанного z-порядка по умолчанию принимают z-порядок 0 и появляются на экране в очереди, в которой они рендерятся. Возможные z-значения для оверлеев от 0 (просто лежит на главной поверхности DirectDraw) до 4 миллиардов (самый ближний к обозревателю). Оверлей с z-порядком 2 перекроет оверлей с z-порядком 1. У двух оверлеев не можут быть одинаковый z-порядок. ЗаключениеНу вот, с теоретической частью кажись покончено. Приятного программирования, Antiloop |
|||||
|