суббота, 9 февраля 2013 г.

рельеф и прорисовка

Естественно, сколько уровней оптимизации блока рельефа столько разновидностей VertexBuffer-ов, различие в которых только в адресах на константы (геометрия блоков рельефа с разной оптимизацией разная).

Где: Vertex координаты угла импостера (импостер генерируется как прямоугольник в плоскости XY, центр прямоугольника в координатах (0;0;0)). Center центр в блоке леса (значение Center.y = половине высоты импостера, значение Center.w = адрес на константу для интерполяции высоты).

float tu,tv,OX,OZ;}IMPOSTERVERTEX;

D3DXVECTOR4 Center;// CenterX, CenterY, CetnerZ, Elevation segment constant

Вот примерный формат вершины импостера:

Само по себе представление импостера схоже с представлением Billboard листвы деревьев. То есть, изначально это вертикальный прямоугольник, центр которого в координатах (0;0;0), формат вершин содержит центр реального положения импостера (в блоке леса).

Вывод всех импостеров с ориентацией на камеру за один раз можно произвести, однако появляется вопрос: каким образом выставить высоты импостеров, чтобы они точно стояли на рельефе (поскольку рельеф не плоский)? Можно применить следующий выход: так как рельеф у нас представлен блоками (которые оптимизируются), и блок леса имеет те же размеры что и блок рельефа, то можно записать в константы VertexShader-а коэффициенты полигонов (для интерполяции высоты по координатам (X,Z)), из которых состоит блок рельефа (уже оптимизированный), чтобы потом в VertexShader-е можно было интерполировать высоту рельефа для заданных X и Z. Соответственно, формат вершины импостера должен содержать адрес на константу (константы) относящуюся к полигону на котором стоит импостер (дерево).

6.2. Вывод импостеров

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

рис.8: текстуры импостера 2-х разных деревьев (левая цветовая, правая нормали)

Импостер сменяет текстуру в зависимости от ракурса, глядя на камеру. Достаточно 4 ракурса под разными углами (0, 30, 60 и 90 градусов), вокруг оси OX (или OZ). Поскольку деревья с листвой из частиц почти со всех сторон (по оси Y) выглядят одинаково, на достаточном расстоянии, можно пренебречь генерацией текстур с ракурсами от 0 до 360 градусов (и соответственно, генерацией текстур «на лету»). И так, для одного дерева мы готовим 4 ракурса и сохраняем это все в одной текстуре (Рис. 8). Кстати, эта же текстура может содержать ракурсы для других деревьев (это значит, что мы можем вывести несколько разновидностей деревьев за один раз, конечно, используя VertexShader1.1 для ориентации импостеров). Для придания объема импостера используется Bumpmapping.

xaxis = normal(cross(Up, zaxis))

Отображение в полном качестве подходит только для тех деревьев, что вблизи. Для удаленных деревьев необходима оптимизация, причем оптимизация по срастанию частиц листвы не достаточна. Поэтому используется вывод через импостеры. Импостер ориентируется на камеру, для чего строится матрица LookAt в VertexShader, целью которой является камера, а вертикалью вектор (0;1;0).

6.1. 3 уровня оптимизации

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

6. Представление лесных массивов

Визуализация лесных массивов и рельефа местности в реальном времени. (4 стр.)

/ / / Визуализация лесных массивов и рельефа местности в реальном времени. (4 стр.)

Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум

Визуализация лесных массивов и рельефа местности в реальном времени. (4 стр.) / Статьи / Программирование игр / GameDev.ru Разработка игр

Комментариев нет:

Отправить комментарий