М.8: Обобщённое рисование 3д фигур
#Gamedev · 1 месяц назад
avatarcommunity
Gamedev1 месяц назад

М.8: Обобщённое рисование 3д фигур

В прошлых заметках я обратил внимание на то, что универсальные шейдеры требуют универсальных решений. С трёхмерными фигурами это особенно важно. Произвольные наборы фигур требуют вложенных циклов, которые с большими полотнами кода просто перестают работать. Даже директива [unroll(x)] пасует перед трудностями.

Но хороший программист не тот, кто пишет много кода. Это тот, кто пишет достаточно.

Прямой способ описать фигуры - придумать для каждой уникальную функцию. Из плюсов: вычисление может быть очень компактным. Как, например, у куба или эллипсоида. Буквальные две строчки.

Из минусов, уже 4 фигуры занимают вот столько места:

А если их 10?

Поэтому я решил пойти от двумерных фигур. Во-первых, мне попалась замечательная формула произвольного многоугольника. От треугольника до круга за одну функцию. 

Изолинии за пределами фигуры плавные

А вот чтобы из двумерной фигуры сделать трёхмерную, есть несколько интересных классов: фигуры вращения и выдавливания.

Фигуры вращения получаются, когда плоскость вращается вокруг оси. Необязательно своей. Например, круг, который вращается вокруг своей оси, создаёт сферу. Но если раскрутить его по кругу большего радиуса, получится тор, он же бублик. Помимо сферы и тора полезными в моделировании являются конус (вращение треугольника) и цилиндр (квадрата). Из условно неполезных можно увидеть фигуры вращения в левом верхнем углу.

Наглядное пособие

Понятное дело, что так мы потенциал многоугольников толком не раскрываем. А это не шутки, это мы целый арктангенс считаем. Поэтому докидываем до кучи фигуры выдавливания. Как можно понять, это вытягивание плоскости по третьей оси. Из треугольника получается треугольная призма, из круга цилиндр (функции избыточно перекрывают друг друга, да), а из шестиугольника... Шестиугольник. Ладно, шучу, все объёмные многоугольники называются призмами. Хитроумно можно сделать даже сферу, но об этом в следующий раз. Все продукты экструзии можно рассмотреть в нижнем ряду.

Соответственно, если мы объединим эти три функции вместе, то получится около десятка стандартных фигур. И бесконечное число нестандартных, конечно же. И всё это в данном куске кода:

Ну а как совсем-совсем обобщить трёхмерные фигуры, это мы поговорим позже.

Cubeap

Игровая индустрия умерла в 93-ем

Комментарии