понедельник, 31 декабря 2007 г.

MS's magic

Частые глюки компилятора MS порождают такие комментарии в коде:

...;// std::vector/deque or boost::ptr_vector/ptr_deque
    // generate a mysterious spell - "MS's compiller error".
    // Seems like std::list have a resistance from that magic


Так и живём.

суббота, 29 декабря 2007 г.

Про нормали

Лод на то и лод, чтобы быть простым и быстрым. Но ведь хочеться чтобы, вдобавок, было и красиво.

Что мы имеем изначально:



Освещение не очень, правда? Как можно это исправить? Правильно, картой нормалей. Откуда её взять? Ну уж не рисовать самому конечно =) У нас же есть высокодетализированная геометрия ландшафа( патчи ).

Выствляем матрицы:

view = math::matrix_look_at_lh(
view,
vec3( 0.f, land_bbox.max.y, 0.f ),
vec3( 0.f, 0.f, 0.f ),
vec3( 0.f, 0.f, 1.f ) );

proj = math::matrix_ortho_off_center_lh(
proj,
0.f,
land_bbox.width(),
0.f,
land_bbox.depth(),
0.f,
land_bbox.height() );
_Winnie C++ Colorizer

В шейдере не стоит забывать, что просто взять и записать в текстуру нормаль нельзя. Ибо она может содержать отрицательные значения. Посему пишем так:
float4 ps_main( in float3 norm : TEXCOORD0 ) : COLOR
{
normal = ( normal + 1.f ) / 2.f;
return float4( norm.x, norm.z, norm.y, 1.f );
}
_Winnie C++ Colorizer

Заодно я поменял y и z координаты, чтобы в дальнейшем не было путанницы ( привет, нелюбимая система координат 3dmax ).

В результате иммем:



Осветить всё это дело проблем уже не составляет.



Таким образом получаем вполне прилично выглядящий лод, который не будет резко выделятся на фоне более детализированнх патчей.

мысли вслух

Иногда так хочеться написать:

std::vector< const some_type & > foo

А низя =(

пятница, 28 декабря 2007 г.

Пару слов про ландшафт

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



Рисум так - сначала лод, после - патчи вокруг камеры. Радиус видимости патчей так же берём из настроек.
Маленькая хитрость - очищать Zbuffer после отрисовки лода. Ибо могут вылезти артефакты. Так же иногда лод нужно немного опустить вниз по Y. Тоже для борьбы с артефактами. Тоже берётся из настроек карты.

Разница между сеткой лода и патчами:



Более подробно про отрисовку пачтей чуть позже.

О карте высот и пользе размытия

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

Но иногда вылазят мелкие пакости, которые портят жизнь.

Рассмотрим вариант, где количество вершин соответсвует количеству пикселей в карте высот. А высота вершины считается как lerp( min_height, max_height, pixel / 255 )

При незначительном перепаде высот всё будет выглядеть хорошо. Но стоит нам его увеличить как вылезут артефакты:



Появляется некая "ступенчатость". Почему? Дело в том что при использованнии карты высот с разрешением 8 бит на пиксель, мы имеем рабочий диапазон значений 0-255. При перепаде высот, скажем, в 100 метров, минимальный шаг между высотами оказывается: 100 / 256 ~ 0.39м.
Именно это низкое разрешение и является причиной "ступенчатости"



Как это побороть? Самый простой способ - увеличить рабочий диапазон. К примеру, до 16 бит, вместо 8ми. Тогда диапазон значений 0-65535. Что даст нам шаг в 100 / 65536 ~ 0.001м. Неплохо, да?

Но это повлечёт за собой увелечение размера карты высот в 2 раза. Что, зачастую, нежелательно.

Есть ещё один путь, требующий небольшого количества телодвижений. Размытие. Или, если будет угодно "усреднение значений".
Блурим в 2 прохода( горизонтальный + вертикальный ) результирующие высоты с небольшим радиусом и получаем приятную картинку =)



Артефакты пропали. Разница очевидна.



Такие дела.

четверг, 27 декабря 2007 г.

Demo

Работа в геймдеве временно приостановлена. И неизвестно, как скоро я туда вернусь. А навыки терять не хочеться =)

Буду делать небольшие демки и объединять всё в один домашний проект. Получится эдакое портфолио.

А тут буду писать заметки по проделаной работе.

суббота, 22 декабря 2007 г.

Hellow world!

Дабы отделить зерна от плевел личное от рабочего буду писать тут на около и рабочую тематику. Привет.

p.s. Для всего остального - моя жжешечка