Незаконченная история про сову, глобус и SDF
Давным-давно в далекой-далекой америге, лет двадцать назад, делали особо специальные платы, занимающиеся быстрым рисованием графики. Сейчас эти карты немного и все больше стараются быть универсальными. Не только в шейдерах, но и в треугольниках. А до этого царил олдскул (old school, не old skull). Ведь когда коту кодеру нечего делать, он делает демосцену. Это шутка, не обижайтесь, если вы кодер или иначе не обижайтесь тоже. Особо искусные мастера делали демосцену еще на древних Эниаках, а для вывода графики использовали матричный принтер.
Когда ГПУ еще не было — вывод графики сводился к дерганью битов в байте в специальных областях памяти или даже в портах ввода/вывода. Иногда компьютер успевал рисовать эти байты быстро и тогда картинка оживала. Это было красиво и в общем-то удобно: записываешь 2 — это красный, рядом 3 — это зеленый, потом ничего не пишешь и это черный. Было очень просто, поэтому интересно и занятно. В голову приходили разные упоротые и не очень эффекты: огонь, плазма, мандельброты всякие и другие фигуры лиссажу. Потом начали рисовать 3д и завертелось...
На современных ГПУ всё непросто, там конвейер и жесткие правила или нужно писать шейдер. Нужно уметь писать шейдер, используя правила конвейера. Скучно, нудно, не интересно. Хотя и спорно: кому что нравится. Параллельно и в то же время компьютерная графика развивалась как наука. По сути, домашние поделки юных падаванов являются сильно оптимизированными алгоритмами строгих научных формул. Как бы падаванам не хотелось изобрести новую вундервафлю — оно уже было, случалось и есть, и тут ничего не поделаешь: синус можно считать рядами, а можно забить в виде таблицы или вообще забить, и дергать функции из стандартной библиотеки. Проблема в том, что надо знать — что и где брать.
На стыке одного с другим, есть интересный подход в строительстве домов на три дэ сцене и набегания на них лучей света. Для начала избавимся от треугольников. Что если мы будем использовать готовые геометрические фигуры? Не будем разбивать их на треугольники, приближая к реальным, а возьмем такими, какие они есть? Сфера — это когда все точки на одинаковом расстоянии от центра, цилиндр там, элипсоид (три дэ овал), брусок, конус и другие. Много разных деталей, чтобы затем собрать из них готовую сову. Причем можно будет приближаться к ним на любое расстояние и они не рассыпятся на пиксели или полигоны, потому что они непрерывные.
С этого момента в памяти ГПУ будут храниться не треугольники, а фигуры целиком. Преимущества треугольников еще в том, что они все одинаково рисуются, а фигуры нет. Для каждой отдельной фигуры придется написать свой маленький кусочек шейдера, зато потом можно бесплатно складывать целые большие кирпичи, шары, цилиндры и прочие фигуры в большие строения. И не только складывать, но и вычитать, умножать и размножать.
Называется это Signed Distance Functions и Ray Marching. Кроме этого используется для рисования 3д фракталов и уже используется в последнем Unreal Engine для просчета теней.
Продолжения сказки не будет.
Поиграться можно прямо в браузере на ShaderToy, вот примеры:
- 29 июня 2018, 14:25
- 07
5 комментариев