Это прелюдия к серии статей, которые я пишу об использовании Vulkan в качестве API рендеринга на macOS посредством MoltenVK, в том числе о том, как настроить его в Xcode и как создать и запустить базовый рендерер.

Я надеюсь показать, что это вполне выполнимо и полезно, и поможет вам начать работу. Короче говоря, да, вы можете использовать Vulkan для своего следующего графического проекта, ориентируясь на macOS, и не беспокоиться о привязке к поставщику или необходимости писать два отдельных механизма рендеринга.

Вулкан против металлической драмы

API-интерфейс кроссплатформенного рендеринга был OpenGL уже много лет. Если вы еще не работали с этим, знайте, что это ужасно. Он полон устаревшего мусора, работает как гигантская государственная машина и в остальном представляет собой большую устаревшую штуку.

(Попытка сделать что-нибудь продвинутое в macOS особенно неприятна.)

Люди, стоящие за OpenGL, Khronos, решили, что пришло время создать современный API-интерфейс графического процессора, чтобы воспользоваться преимуществами новых возможностей устройств и избавиться от лишнего. Да!

И Apple рассматривала возможность использования Vulkan. На мгновение.*

Это было похоже на тот момент в Властелине колец, когда зло можно было уничтожить навсегда, просто бросив золотое кольцо в яму с лавой, но человеческая жадность и гордость помешали.

Apple решила, что было бы круче заниматься своим делом, и назвала это Metal, и все надежды мира на хороший графический API были потеряны.

Потом кто-то сказал: «К черту, давай просто сделаем Vulkan на Metal», и родился MoltenVK. MoltenVK начинался как коммерческий проект, но с тех пор стал бесплатным и с открытым исходным кодом (благодаря пожертвованию от Valve?).

Вскоре после этого Apple прекратила поддержку OpenGL, более или менее вынуждая людей использовать Metal. По крайней мере, они на это надеялись!

* [Edit] Спасибо Fedy за указание на то, что релиз Metal предшествовал выпуску Vulkan.

Судя по тому, что мне удалось собрать воедино, Khronos Group, включая (вероятно) члена Apple, обсуждала новый API, и Apple появилась из ниоткуда с Metal. Khronos запустил его в полную силу, а AMD пожертвовала Mantle, чтобы ускорить процесс.

Apple была первой на рынке с Metal, но неясно, в какой степени внутри группы, похоже, будет участвовать Apple. Может быть, они этого и не ожидали, хотя их участие в * GL предполагает, что так оно и было бы.

Жизнеспособен ли Vulkan on Metal?

Запуск одного графического API на другом совместимом API кажется далеко не идеальным. Я знаю по крайней мере одну компанию, которая приняла эту идею (как замену OpenGL) из-за потенциальной сложности.

На практике, однако, очень чисто. Это потому, что MoltenVK работает как драйвер уровня 0 для Vulkan. Он полностью прозрачен с точки зрения вашего приложения. После включения в качестве библиотеки (статической или динамической) вы больше не будете с ней взаимодействовать. Весь клиентский код напрямую взаимодействует с Vulkan, как и на любой другой платформе.

Вы не взаимодействуете с MoltenVK или Metal, только с Vulkan. Единый API для управления всеми.

MoltenVK работает так же, как и любой другой драйвер Vulkan, за исключением того, что он транслирует команды в Metal, а Metal разговаривает с GPU.

Представление?

Если есть проблемы с производительностью, я их еще не видел. То же самое с ошибками и проблемами совместимости. Я не говорю, что интеграция безупречна, но она определенно многообещающая. MoltenVK - активный проект, поэтому с любыми проблемами всегда можно будет разобраться. Это также открытый исходный код, а это значит, что вам не нужно ждать исправлений, вы можете сделать их сами.

Кроме того, я не собирал никаких тестов, чтобы напрямую сравнивать эти два подхода. Я могу в будущем.

Вы, конечно, можете просто использовать Metal. Metal - это современный API графического процессора, который выполняет ту же роль, что и Vulkan. Вы получите такую ​​же производительность, как и с Vulkan.

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

Это, конечно, не означает создание двух отдельных приложений, но возникнут накладные расходы на абстрагирование рендеринга, чтобы можно было как можно проще поменять местами Metal и Vulkan. Сделав это, я могу с уверенностью сказать, что сделать внутренний рендерер агностиком - нетривиальный объем работы.

Работаете с Vulkan vs Metal?

Они оба новы, ориентированы на результат и имеют много общего. Однако Vulkan намного более подробен. Вы можете запустить Hello Triangle на Metal с помощью нескольких сотен строк кода, а на Vulkan вам будет сложно сделать это менее чем за 1 КБ. То есть тысяча строк кода для треугольника Hello.

Положительным моментом является то, что Vulkan пытается предоставить как можно больший контроль, чтобы рендеринг можно было адаптировать к текущей задаче, обеспечивая наилучшую возможную производительность.

Дело не в том, что Metal не дает такую ​​гибкость, просто эти решения принимаются явно с помощью Vulkan, тогда как вы работаете с гораздо большим количеством значений по умолчанию с Metal и двумя языками (Objective-C и Swift), которые, как правило, менее подробны, чем C ++ по умолчанию для Vulkan.

Выбор языка

Metal, конечно, дает вам Objective-C и Swift. Для шейдеров необходимо использовать формат Apple metal. Металл похож на GLSL в том смысле, что они оба С-подобны, но они несовместимы.

Vulkan написан на C ++, хотя существуют привязки разных уровней зрелости для других языков. Однако для нашего проекта macOS нет смысла работать с чем-либо, кроме C ++ по умолчанию.

Шейдеры Vulkan должны быть в двоичном формате SPIR-V. Vulkan поставляется с компиляторами, которые принимают GLSL и HLSL. Я почти уверен, что компиляторы Metal to SPIR-V тоже существуют, хотя в этом случае вы, скорее всего, будете использовать GLSL.

Плюс в том, что GLSL является более или менее «стандартным» форматом для шейдеров, и в Интернете по ним существует огромное количество информации.

[Edit] Как сказал мне Саша Виллемс, Vulkan - это C API с необязательными заголовками C ++. Я мысленно поменял их местами.

Давайте начнем

В следующем посте я расскажу, как получить Vulkan, MoltenVK и как настроить проект Xcode для их включения. Я также расскажу об интеграции уровней проверки Vulkan, которые избавляют от множества догадок при работе с Vulkan.

Скоро будет…

Первоначально опубликовано на lattejed.com.