суббота, 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 ).

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



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



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

2 комментария:

Анонимный комментирует...

пожалуйста пиши ещё, очень интересно и нужно

Анонимный комментирует...

Браво, мне кажется, это отличная фраза