Overwhelement - преобразователь двухмерных плоскостей в дискретные информативные структуры данных. Он принимает в себя стопку плоскостей, которые содержат линии и треугольники, вершины которых заданы в экранных координатах, а затем возвращает результат наложения этих плоскостей друг на друга в виде буфера элементов. За один проход дискретизации, из буфера элементов можно получить фреймбуфер, карту высот, карту освещения, или иерархию слоёв. Буфер элементов можно использовать для вывода в графическое окно, терминал, ASCII изображение, LED-панель, E-Ink дисплей, преобразовать в tensor для ML, на матрицу из ламп, или куда-угодно ещё, на что мне не хватило фантазии. Код полностью сгенерирован, никакого человеческого интеллекта в создании задействовано не было.
Директория examples содержит примеры использования overwhelement. По адресу examples/assets хранятся ресурсы, которые используются в некоторых примерах. В папке examples/image_viewers представлены просмотрщики изображений, сделанные на базе overwhelement. В директории examples/readme_images содержится код, который использовался для создания всех изображений в этом же README документе.
Любое непрерывное пространство является бесконечно делимым. У него нет какого-то постоянного "шага": чтобы измерить пространство, нужно взять срез, и назвать это единицей меры. Такой процесс получения среза чего-то бесконечного называют дискретизацией, а единицу меры - дискретом.
Процесс дискретизации в компьютерной графике часто ассоциируется с растеризацией, то есть получением массива векторов, где каждый вектор содержит три целочисленных значения - получением пикселей. Растеризация включает в себя дискретизацию, но это не совсем одинаковые понятия. Один пиксель, это только частный случай дискреты плоскости. Он не содержит в себе всех значений плоскости, из которого его получили. Плоскости могут иметь индексы высот, умножить цвет объекта на его освещённость или упустить другие метаданные, которые не сохраняются в пиксельной структуре. Если же нужно только дискретизировать плоскость, то растеризатор может не дать всей полноты требуемой информации. Если нужно не просто раскрасить экран, а получить более полную информацию, то приходится запускать процесс растеризации по несколько раз.
Дискретизатором же я назвал то, что превращает бесконечную плоскость в массив конечных дискрет, с максимальным сохранением информации о плоскости за один процесс дискретизации. Именно таким дискретизатором и является Overwhelement.
Растеризаторы, как упоминалось ранее, зачастую предоставляют лишь одну интерпритацию дискреты - пиксель. Я решил, что если я хочу сохранить дискрету в полном виде, то интерпретация этой дискреты останется на внешней программе. Можно извлечь пиксель, если взять дискрету, извлечь оттуда цвет, освещённость и умножить их. Или построить карту высот, если взять ту же дискрету и извлечь оттуда только её глубину.
В связи с этим, я решил отделить "дискретизацию" от "интерпретации", которые объеденены в растеризаторах. Это делает Overwhelement немного более сложным, но, тем не менее, более гибким в использовании. Один и тот же результат дискретизации можно интерпретировать несколькими способами. От этого, процесс работы с Overwhelement состоит из трёх этапов:
Диаграмма сделана с использованием Overwhelement, её код представлен в
examples/pipeline_diagram.rs
- Одна функция или программа предоставляет двухмерную плоскость. Это программа-провайдер. Ей может быть программа для проекции трёхмерной сцены, интерфейс приложения, векторное изображение, или ещё что-нибудь, что требует дискретизации.
- Эта двухмерная плоскость отправляется в программу-дискретизатор, и превращается в дискретную структуру данных.
- Полученная дискретная структура интерпретируется внешней программой-интерпритатором произвольным образом. Неважно как: отображение цвета, рисование изображения, выявление глубины или машинное обучение - что угодно.
Overwhelement представляет ошеломляюще гибкую настройку входных данных, и она может показаться неочевидной на первый взгляд. Для простоты посмотрим на Plane. Он содержит в себе индексы на список Viewport в общем конейнере - сцене. Viewport определяет то, какой участок плоскости будет виден, и дискретизирован.
Рисунок сделан с использованием Overwhelement, его код представлен в
examples/plane_viewport.rs
По этому рисунку видно, как вьюпорт занимает лишь определенный участок плоскости, чтобы задать рамки для дискретизации. Всё, что внутри вьюпорта будет дискретизироваться, а остальное - отсекаться. Это вырезка, или снимок плоскости, которая выставляется перед наблюдателем. В Overwhelement Viewport можно свободно двигать, масштабировать и поворачивать, чтобы захватить только ту часть Plane, которую нужно дискретизировать. У одного Plane может быть множество вьюпортов. При дискретизации, в своей внутренней реализации, Overwhelement проходит по каждому из вьюпортов, и по очереди, последовательно выставляет их перед наблюдателем, собирая коллаж из различных фрагментов одной и той же плоскости но разных её "снимков".
Рисунок сделан с использованием Overwhelement, его код представлен в
examples/readme_images/multiple_viewports.rs
Но внутри одной этой плоскости, порядок перечисления вьюпортов не даёт им приоритета друг над другом: имеет значение только глубина объектов, которые включает в себя вьюпорт. На рисунке выше, в левой части изображена плоскость, и два прямоугольника - каждому соответсвует свой вьюпорт. В правой части результат их наложения друг на друга. Из рисунка видно, что вьюпорты не перезаписывают, а дополняют друга. В итоге, если на снимке есть фигура, которая целиком или частично перекрывает то, что позади (то есть её глубина depth меньше, чем у фигуры позади, и она оказывается ближе к наблюдателю), то она перезаписывает прошлые видимые дискреты своими, более близкими к наблюдателю значениями, создавая коллаж из единой плоскости.
TODO: Дописать README


