15 апр. 2010 г.

LOD

В общем немного не правильно размышлял.....
Я рассчитал три варианта индексного буфера, от которых пляшет моя детализация ландшафта.

И потом делал что то типа такого:

for i:=0 to> chanks-1 do
//chanks - кол-во чанков
begin
// рисуем чанк, только если его
// boundbox виден в камере
// MinBBox[i], MaxBBox[i] - точки
// boundbox'а определенного чанка
if see(MinBBox[i], MaxBBox[i]) then
begin
// вычисляем дистанцию между камерой
// и определенным чанком
// TerrDist[i] - вершина середины чанка
// eye - положение камеры
D3DXVec3Subtract(TerrLength, eye, TerrDist[i]);
//если дистанция меньше 300 то LOD0
if D3DXVec3Length(TerrLength) < 300 then
begin
FD3DDevice.SetIndices(IB_LOD0);
FD3DDevice.DrawIndexedPrimitive(...);
end else
begin
//если дистанция меньше 500 то LOD1
if D3DXVec3Length(TerrLength) < 500 then begin
FD3DDevice.SetIndices(IB_LOD1);
FD3DDevice.DrawIndexedPrimitive(...);
end else
begin
//в других случаях LOD2
FD3DDevice.SetIndices(IB_LOD2);
FD3DDevice.DrawIndexedPrimitive(...);
end;
end;
end;
end;


То есть выбор уровня детализации шел в зависимости от расстояния до камеры. А это мне не подойдет, так как чтобы правильно соединять различные чанки с различной детализацией, нужно иметь по 9 вариантов буфера, каждого лода (кроме первого - тогда используется учащение, либо кроме последнего - прореживание).

2 лода по 9 вариантов + 3ий лод, итого 19 вариантов буферов индексов (можно конечно все и в один запихать).

После построения алгоритмом этих вариантов, дальше все будет работать примерно так:

// находим чанк, в пределах которого
// находится камера - eye
StartChank := camerachank(eye);
// если предыдущий StartChank не равен
// нынешнему, то заполним схему-массив
// заного
if LASTStartChank <> StartChank then
begin
for i:= 0 to w-1 do
begin
for j:= 0 to h-1 do
begin
chanklod[i*(w-1)+j].lod:= какой то из 3х лодов
chanklod[i*(w-1)+j].var:= один из девяти вариантов стыковок
end;
end;
end;

for i:= 0 to w-1 do
begin
for j:= 0 to h-1 do
begin
if see(MinBBox[i], MaxBBox[i]) then
begin
// рисую опеределенный чанк с параметрами
// по заполненному массиву
end;
end;
end;

LASTStartChank := StartChank;




Итого получается что схема-массив будет перестраиваться только тогда, когда камера будет находится на новом чанке. Потом в зависимости от того, на каком чанке находится камера, будет заполняться массив-схема, где каждому чанку будет присвоен уровень лода и один из вариантов стыковки, что пригодится при прорисовке.

К сожалению, это ПОКА ЧТО только теория, мой алгоритм из 19 нужных вариантов индексов строит лишь 3, а так же нет алгоритма по заполнению массива-схемы.


___________________________

Ну начинаю понемногу реализовывать, написал алгоритм, который бы заполнял массив-схему.
Выглядит это примерно так:


С "птичьего полета" примерно так:


высокой детализации беру 9 чанков, вокруг них одним слоем средняя детализация, все остальное низкая детализация.

___________________________

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

Результат:



5 апр. 2010 г.

Splitting

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

Мой ландшафт состоит из 257 на 257 пикселей, где каждый пиксель вершина ландшафта.
В итоге получается мой ландшафт состоит из 65536 квадратов, которые в свою очередь делятся на 131072 треугольника.

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

В общем поделил я его на 8 строчек и 8 колонок, итого 64 части, каждая состоящая из 1024 квадратов.

Но опять же мой алгоритм, позволяет делить ландшафт, так как этого захочу я :)





1 апр. 2010 г.

Multitexturing

Мультитекстурирование по высоте:



Минус в том что с каждым последующий "слоем" текстур смешивается все больше...
Например:
1 слой: текстура гор
2 слой: текстура гор + текстура травы
3 слой: текстура гор + текстура травы + текстура песка

В итоге получается не совсем красиво.

Мультитекстурирование по маске: