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

         

Зато теперь не будет работать сложение, не вызывающее переноса - в этом случае единички останутся...


Зато теперь не будет работать сложение, не вызывающее переноса - в этом случае единички останутся на месте и испортят все смещение. Получается, что перед сложением нужно выставлять нужные биты в единичку, а после сложения их же и очищать. Соответствующий цикл будет выглядеть так: // ... u = make_tile_u(u); v = make_tile_v(v); du = make_tile_u(du); dv = make_tile_v(dv); for (current_sx = x_start; current_sx

Здесь make_tile_u(), make_tile_v() осуществляет перевод u, v в "тайловую" форму; unfix() просто сдвигает u, v на собственную дробную часть, оставляя лишь целую, TILE_U_MASK, TILE_V_MASK заполняют нужные биты числа единичками. В нашем примере видно, что TILE_U_MASK = 0x380000; // 00000000 00111000 00000000 00000000 TILE_V_MASK = 0x7C3000; // 00000111 11000111 00000000 00000000

По сравнению с обычным текстурированием добавилось более четырех инструкций. Много. Смотрим дальше. С той же самой целью - заставить биты "перепрыгивать дырки" при сложении - можно не заполнять дырки единичками в u, v для каждой точки, а сделать это один раз для du, dv. Кроме того, unfix() можно делать один раз, а не два, заменив (unfix(u) + unfix(v)) на unfix(u + v). Но здесь надо проследить за тем, чтобы дробные части u, v при сложении не вызвали бы переноса и не испортили смещение на единичку. Достигается это использованием fixedpoint 8:15 и вставкой одного запасного бита между целой и дробной частью u, v. Т.о., битовые раскладки для нашего примера теперь выглядят вот так: tile_u_part 00000UUU UU000uuu 0fffffff ffffffff tile_v_part VVVVV000 00vvv000 0fffffff ffffffff tile_du 00000UUU UU111uuu 1fffffff ffffffff tile_dv VVVVV111 11vvv111 1fffffff ffffffff TILE_U_MASK 00000000 00111000 10000000 00000000 TILE_V_MASK 00000111 11000111 10000000 00000000

А окончательная версия цикла выглядит вот так: // ...



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