Skip to content

Slavonator/overwhelement

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Overwhelement


Кратко

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

  1. Одна функция или программа предоставляет двухмерную плоскость. Это программа-провайдер. Ей может быть программа для проекции трёхмерной сцены, интерфейс приложения, векторное изображение, или ещё что-нибудь, что требует дискретизации.
  2. Эта двухмерная плоскость отправляется в программу-дискретизатор, и превращается в дискретную структуру данных.
  3. Полученная дискретная структура интерпретируется внешней программой-интерпритатором произвольным образом. Неважно как: отображение цвета, рисование изображения, выявление глубины или машинное обучение - что угодно.

Перекрытия

Overwhelement представляет ошеломляюще гибкую настройку входных данных, и она может показаться неочевидной на первый взгляд. Для простоты посмотрим на Plane. Он содержит в себе индексы на список Viewport в общем конейнере - сцене. Viewport определяет то, какой участок плоскости будет виден, и дискретизирован.

Viewport

Рисунок сделан с использованием Overwhelement, его код представлен в examples/plane_viewport.rs

По этому рисунку видно, как вьюпорт занимает лишь определенный участок плоскости, чтобы задать рамки для дискретизации. Всё, что внутри вьюпорта будет дискретизироваться, а остальное - отсекаться. Это вырезка, или снимок плоскости, которая выставляется перед наблюдателем. В Overwhelement Viewport можно свободно двигать, масштабировать и поворачивать, чтобы захватить только ту часть Plane, которую нужно дискретизировать. У одного Plane может быть множество вьюпортов. При дискретизации, в своей внутренней реализации, Overwhelement проходит по каждому из вьюпортов, и по очереди, последовательно выставляет их перед наблюдателем, собирая коллаж из различных фрагментов одной и той же плоскости но разных её "снимков".

Перекрытия viewport

Рисунок сделан с использованием Overwhelement, его код представлен в examples/readme_images/multiple_viewports.rs

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

TODO: Дописать README

About

Software discretizer for non-standard graphics output.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages