Как из SCNSphere сделать что угодно с помощью Metal. Например, 3D RGB-Cube

Джулс: Знаешь почему так? 
Брэд: Метрическая система?
Джулс: Гляди как наш Бред мозговит!
Смышленый сукин сын, это точно — всё просек.
(из фильма «Криминальное чтиво»)

Дорогие слушатели нашей радиостанции, если вы переодически следите за нашими выпусками, то в целом в курсе наших новейших исследований цвета в нашей высоко-профессиональной любительской лаборатории. И уже имеете представление о том как цвет влияет на общее восприятие изображения. Очень важной фишкой в таких исследованиях являются цветовые пространства, в которых, обычно, можно производить манипуляции с пикселами картинки, системно её «ухудшая». Так удачно сложилось, что почти все такие пространства 3-х компонентные. А это означает, что мы можем попытаться визуализировать то как наши дурные наклонности могут его деформировать относительно исходного состояния в 3D сцену.

В многообразии фреймворков Apple есть очень мощный SDK SceneKit.  Сегодня мы распотрошим сразу двух кроликов: изучим как нам нарисовать произвольную 3D-фигуру с помощью инструментов SceneKit. А так же научимся добавлять очень большое количество дополнительных объектов в 3D-сцену, быстро её  деформировать, модифицировать и манипулировать свойствами всех добавленных объектов с помощью Metal.

А заодно докажем, что серая сфера на самом деле это цветной куб.

sphere-deformation
Рис.1. Лёгким движением руки сфера превращается в элегантный кубик

 

Сразу Код(да)

Продемонстрировать эти наши доказательства мы намереваемся с помощью приложения использующего SceneKit и Metal, а так же наш новый блестящий примус: проект IMProcessing. Как всегда, если читать много букв лень, лезем в ImageMetalling и клонируем пример ImageMetalling-15. Дальше традиционные pod install и сборка.

SceneKit

SceneKit — высокоуровневый фреймворк, предназначенный для работы над композициями трехмерных сцен. Он включает в себя движок расчета физики, генератор частиц и удобный API. В основе SceneKit лежит граф сцены. Это все очень похоже на  то, что широко используется в игровых движках типа Unity и 3D-редакторах типа Blender (а это всё вообще-то очень круто).

Основным элементом графа сцены, в терминах SceneKit,  является узел SCNNode. Он содержащий в себе информацию о положении, углах поворота, масштабе, а так же несколько свойств описывающих «физическую» сущность объекта. Положение, вращение и масштаб дочерних узлов определяются относительно родительского узла. Корневым элементом для создания любой сцены является SCNScene. Рисуется всё это в SCNView.

Свойства узла могут задавать:

  • SCNGeometry — определяет форму объекта и его отображение за счет набора материалов;
  • SCNCamera — отвечает за точку пространства сцены, из которой мы видим сцену;
  • SCNLight — отвечает за освещение, его положение влияет на все объекты сцены.

Очевидно, для создания любого 3D изображения в целом необходимо и достаточно умелых пальцев рук, представления о геометрии и линейной алгебре, терпения и усидчивости. И немного-много свободного времени.

 

Задача

В одном из постов мы уже разобрали как можно, достаточно быстро, написать свой собственный Инстаграм используя движок Metal. В нём мы достаточно подробно разобрали, что такое LUT-ы, зачем LUT-ы и как их использовать. Но, одно дело понимать для чего и как, а другое дело зафиксировать понимание на сетчатке глаза — люди же визуалы.

И так, будем формулировать задачу в таком ключе: возьмем исходное цветовое RGB-пространство представим его в координатах xyz. Так же мы знаем, что для наших вычислений оно всегда ограничено размерностью [0,1] по всем осям. Если мы нарисуем такой  объект то получим кубик — что-то похожее на то, как это показано на Рис.1. Назовем эту фигуру исходным LUT (identity) — каждая дискретная точка пространства отображается сама в себя. Как мы выяснили ранее нам интересны цвета, по каким-то правилам деформировать — т.е. мы можем показать с помощью такого преобразования кубика общую деформацию исходного пространства в новое. И эта новая форма, по идее нам о чём-то важном в итоге скажет. Точнее покажет.

На Рис.2 видно как искажается исходное RGB-пространство с помощью фильтров использующих LUT-ы из файлов filter2.cube и filter3.cube. Один из фильтров вообще сжимает все пространство в «прямую» (но с разной плотностью семплов!). И похожее преобразование цветов делается при фиксации изображения с помощью галогенидов серебра.

lut-examples-metalagram
Рис 2. То как выглядят LUT-ы на самом деле

«Цветовые» искажения отобразят кубик в какую-то другую фигуру — отразят исходные точки в новые.

 

Создание сцены

Ну, окей, про очевидные вещи вроде понятно. Как теперь все это нарисовать? Начнем с того, что мы создадим сцену из трех типов фигур:

  1. Сферы нам нужны для отрисовки крайних точек куба и сетки из «частиц» для отрисовки внутренностей кубика. Для того, что бы видеть искажения тела и представлять «ландшафт» этой деформации;
  2. Цилиндры нам нужны для отрисовки ребер куба;
  3. Бокс нам нужен для отрисовки граней.

Все эти объекты рендеринга уже подготовлены в SceneKit в виде полигональной сетки, т.е. с заданными вершинами и треугольниками для отрисовки свойств поверхностей этих объектов. Вроде бы все просто, но есть одна хрень, которая несколько усложняет задачу: для правильной отрисовки деформации пространства и частиц должно быть много, и поверхность бокса должна быть детализирована достаточно точно — т.е. должно быть задано много вершин описывающих треугольники. А еще нам нужно нарисовать много частиц. Например, частиц на рисунках 16x16x16, т.е. 4096, а mesh бокса может быть детализирован до такого-же разрешения для каждой грани. Т.е. все хорошо — мы нарисовали сцену с помощью SceneKit и она даже отрендерилась на GPU. Но как её модифицировать? Т.е. изменять свойства на CPU? Ну, очевидно нам опять дорога в  шейдеры и ядра на MSL — т.е. там все и будем перевычислять;)

 

Рендеринг сферы в куб и раскраска в GPU

В листинге кусочка программы мы показали как привязать шейдеры для Metal Shading Language (MSL) к сцене для того, что-бы созданный для SceneKit объект можно было кастомно модифицировать в наших практических целях. А еще мы решили, что в пень кубики — юзаем шарики. Хотя почти никакой разницы в целом нет. Просто сфера более экономически выгодная структура — ибо 64-х сегментов нам хватит для построения более-мене читаемого изображения любой формы. Hу, еще, да — нам нужно раскрасить поверхность ~ правильными цветами и показать, что произошло внутри с точками пространства — т.е. сделать грани прозрачными.

Что делать с 4096-ю частицами?

В целом же это тоже до хрена. Да еще же нужно все это интерполировать из уже готового LUT. А мы делали это только для коррекции текстур изображения. Да в целом то тоже самое делать — просто передаем в ядро не текстуру, а исходный набор 4096 точек с rgb позициями и точно также семплируем их в новые позиции только в MTLBuffer для чтения потом в контексте CPU.

Для того, что-бы не перерисовывать свойства частиц в сцене при каждом движении задаем для SCNView делегат кастомного рендеринга.

 

Выводы

Друзья, считаю, что сегодня был настоящий, хоть и без затей, джорней в мир 3D-графики и ускорителей в их изначальном смысле. Мы увидели, что не все то куб, что кажется пеньком. А так же научились использовать SceneKit совместно с Metal, а это как минимум забавно и скрашивает нашу серую реальность виртуальными развлечениями. Вот много вы знаете людей которым луты интересно рисовать и об этом рассказывать? … Вот и я тоже.

Всем инжой!

 


Еще раз напомню: авторы блога не преследуют задачи быть предельно корректным, но если заметили явную ашипку, если написали явную глупость, если что-то не понятно: комментируйте или пишите на: imagemetalling [*] gmail.com .

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s