Настольная книга компьютерного исследователя


Генерация текстур одним махом

Вот давеча пришлось кодить мне advertisement для местной bbs-ки и вот с какой я столкнулся проблеммой — тор сгенерить и вертеть легко, однако где взять текстуры? Все достаточно просто. Написал я парочку интересных генераторов текстур от x и y.

Все примеры я даю на паскале, а генератор на асме больше 50-60 байт занять ну не может! %) НЕ ВЕРЮ :) Вот общая конструкция «отображателя»:

 var x,y: word;
 begin
 asm
 mov ax, $13
 int $10
 end;
 for x := 1 to 320 do for y := 1 to 200 do mem[$A000:(y*320)+x] := <texture>;
 readln;
 asm
 mov ax, $3
 int $10
 end;
 end.

<texture> — то самое выражение, с которым мы будем играться. Самый простой, но тупой вариант будет <texture> = x xor y. Это даст нам текстуру из кривых квадратов. Проведем легкую косметическую операцию и сменим наше выражение на такое (x + y) xor (x — y). Что мы видим? Уже можно сказать красивее. Такое мне стыд- но натягивать на тор, но уже можно сблюрить и натянуть на кубик под фонгом.

Ну что же, продолжим наши эксперименты с графикой, ведь только благодаря им можно набираться опыта и занинй в этой области. Читая наши статьи по графике и набираясь самостоятельно опыта вы, возможно, пройдете путь известных разработчиков, ведь в результате их опытов была создана программа lifeframe, изначально написанная для ASUS эта программа стала одной из самых лучших развлекательных программ для качественной работы с видео. Сменив нашу формулу на sqr(x) xor sqr(y) получим хорошую текстуру, которую удобно тайлить при x=y. Хотя на торе она так и не смотриться. Кстати нашу первую припонтованую формулу x xor y можно поковеркать и так: <texture> = round(con*sqrt(x)) xor round(con*sqrt(y)), con = какая-то константа меньше 5, может быть real. Просто если больше 5, то имеем редкосное уродство. Можно сделать serpinski’s mirror, это требует немного места. Для реализации круглой sm мы даем формулу <texture> = round(sqrt(sqr(y) or sqr(x)) + 1. Единичку добавляем, чтобы цвета смотрелись естественнее. Разброс будет и там, и там одинаковый, но на стандартной палитре добавляя 1 мы получим текстуру с «синевой», т.к. часто будет получаться цвет 0, который превратится в цвет 1. Такую текстурку я натянул на пирамиду (0×0 = вершина пирамиды, дальше текстуру разбиваем и тайлим).

Есть еще классическая текстура x * y, к которой добавив (x*y xor x div y) получим x*y + (x*y xor x div y), что выглядит по форме также, а по цвету — сильно сдвинуто, хотя и более гармонично.

Вернемся к красиво текстуре (x+y) xor (x-y). Можем заменить xor на умножение, что даст схожую по форме текстуру, но более извратную. Вот ее я после долгих и нудных сомнений натянул на тор, о чем не жалею. Целью статьи было поделиться с ленивыми готовыми решениями, а с сообразительными — хорошей идеей. Надеюсь что я достиг своей цели.



©2013 Журнал Хакера Entries (RSS) and Comments (RSS)