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

         

Вот пример для текстуры размера 256x256 и тайла размера 8x8:


Вот пример для текстуры размера 256x256 и тайла размера 8x8: Текстура в пикселах: 0, 1, 2, 3, ..., 255 256, 257, 258, 259, ..., 511 512, 512, 513, 514, ..., 767 ... Текстура в тайлах: 0, 1, 2, 3, ..., 31 (первые восемь строк пикселов) 32, 33, 34, 35, ..., 63 (вторые восемь строк пикселов) 64, 65, 67, 68, ..., 95 ... Тайл 0 в пикселах: Тайл 1 в пикселах: 0, 1, ..., 7 8, 9, ..., 15 256, 257, ..., 263 264, 265, ..., 271 512, 513, ..., 519 520, 521, ..., 527 ... ... 1792, 1793, ..., 1799 1800, 1801, ..., 1807

В этом случае все близкие к текущему текселы почти наверняка находятся в текущем тайле, и количество кэш-промахов хоть как-то, да уменьшается. То есть, тайлы как бы позволяют двигаться в текстуре и по горизонтали, и по вертикали. Зато изменяется код расчета смещения нужного пиксела в текстуре. Посмотрим, что получится для случая на иллюстрации. Пусть координаты в текстуре (то есть, их целые части) равны u, v; тогда номер нужного тайла равен (v / 8) * 32 + (u / 8), а координаты в тайле равны (u % 8), (v % 8) соответственно. Тут помогает то, что 8 - степень двойки, получается, что номер и координаты в тайле можно посчитать и проще, а по ним находим и смещение в текстуре: tile_number = ((v >> 3) > 3); tile_u = u & 0x07; tile_v = v & 0x07; texture_offset = (tile_number

Напишем эти формулы и для общего случая, то есть для текстуры размером (2^TEXBITS)x(2^TEXBITS) и тайла размером (2^TILEBITS)x(2^TILEBITS): TILEMASK = ((1 > TILEBITS) > TILEBITS); tile_u = u & TILEMASK; tile_v = v & TILEMASK; texture_offset = (tile_number

Делать такое преобразование для каждого пиксела текстуры - занятие довольно небыстрое.



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