Самоучитель по 3dsmax 7

         

TILE_U_MASK; dv = make_tile_v(dv) | TILE_V_MASK; for (current_sx = x_start; current_sx


u = make_tile_u(u); v = make_tile_v(v); du = make_tile_u(du) | TILE_U_MASK; dv = make_tile_v(dv) | TILE_V_MASK; for (current_sx = x_start; current_sx

В переводе на ассемблер, заимствованном из все того же fatmap2.txt, все это выглядит вот так: mov eax,tile_u_part mov ebx,tile_v_part mov ecx,length mov esi,texture mov edi,outputbuffer lea edi,[edi+ecx-1] xor ecx,-1 lea ebp,[eax+ebx] inc ecx inner: add eax,tile_du add ebx,tile_dv shr ebp,16 and eax,11111111110001110111111111111111b ; (~TILE_U_MASK) and ebx,11111000001110000111111111111111b ; (~TILE_V_MASK) inc ecx mov dl,[esi+ebp] lea ebp,[eax+ebx] mov [edi+ecx],dl jnz inner

Осталось упомянуть про то, что тайлы можно расположить не по горизонтали, а по вертикали: Текстура в тайлах: 0, 32, 64, ... 1, 33, 65, ... 2, 34, 66, ... ...

Тогда преобразование для целых частей u, v выглядит следующим образом: tile_number = ((u >> TILEBITS) > TILEBITS); tile_u = u & TILEMASK; tile_v = v & TILEMASK; texture_offset = (tile_number

Выделяя u, v, получаем: tile_u_part = ((u >> TILEBITS) > TILEBITS)

то есть tile_u_part = ((u >> TILEBITS)

Все это делается для единственной цели - скорости. В таком виде перевод u, v в "тайловые координаты" делается немного проще и быстрее; внутрениий цикл же остается таким же (ну, константы (~TILE_U_MASK) и (~TILE_V_MASK), конечно, поменять придется, но это непринципиально).



Содержание раздела