что такое metal apple
Что такое Apple Metal API
Еще несколько лет назад Apple представила новое графическое API — Metal. Отличие его от того же Scene Kit было в том, что он явялется не высокоуровневым API, работающим поверх OpenGL ES (мобильной версии OpenGL), а низкоуровневым API для рендеринга и вычислений, который может заменить собой OpenGL. По словам Apple, Metal на порядок быстрее OpenGL ES (правда, на деле в 10 раз быстрее происходят только вызовы отрисовки — draw calls, передача данных на GPU). Этот API доступен для всех устройств, работающих на процессоре A7 и новее, а так же на Mac начиная с 2012 года.
Принципы работы графических API
Для начала — что такое API? Расшифровывается это как Application Programming Interface, программный интерфейс приложения. Говоря простым языком — это готовый код, который позволяет существенно облегчить жизнь программисту при написании программ. По сути это некоторый полуфабрикат — основываясь на этом коде можно гораздо быстрее и проще написать свою программу.
Теперь разберемся с тем, как собственно сам GPU работает с API. Неверно думать, что вызов API напрямую работает с GPU, и тем более неверным является то, что GPU заканчивает обработку вызова при возвращении результата API. К примеру, если бы драйвер выполнял команды рендеринга в тот момент, когда они были созданы, то простаивал бы CPU, ожидая выполнения рендеринга. А после выполнения было бы наоборот — простаивал бы GPU, ожидая пока придут новые команды от драйвера.
По этой причине CPU и GPU работают асинхронно: графический драйвер сначала собирает все вызовы отрисовки для всего кадра, и только потом отправляет их на GPU. Далее, когда приходит команда на отрисовку следующего кадра, этот кадр уже будет обработан GPU. То есть мы получаем задержку в один кадр: пока CPU готовит вызов для текущего кадра, на GPU рендерится прошлый. На деле можно буферизировать и больше одного кадра, и тем самым получать большую частоту кадров: все зависит только от производительности процессора и видеокарты.
Нововведения в API Metal
В чем же плох метод, описанный выше? Он плох в том, что между GPU и API есть посредник — драйвер. И именно он управляет задержками. В API Metal же буферы команд открыты, и приложение может само их заполнять и отправлять их в очередь команд для выполнения на GPU. Таким образом, приложение имеет полный контроль над заданием и может управлять задержками. Более того — теперь можно легко параллелить команды и помещать их в буфер в определенном порядке, так как для программиста становится более очевидным то, какие результаты в каком порядке будут доступны.
Еще одно важное нововведение уже аппаратное: на процессорах Apple A7 и выше Metal заточен под работу с общей памятью, то есть CPU и GPU могут получать доступ к одним данным без необходимости перебрасывать их по шине PCI. Metal дает прямой доступ для программы к буферам CPU, и программист вполне может «смешивать» вычисления на GPU и CPU, что может существенно ускорить программу.
Реальный выигрыш от API Metal
Как я объяснял выше, каждый вызов отрисовки занимает некоторое время на CPU и GPU. Ренденринг на GPU сделать быстрее нельзя по очевидным причинам (он завязан только на производительность самого GPU), но можно выиграть в другом: во-первых, можно уменьшить время на передачу данных (так как Metal работает с общей памятью), во-вторых — уменьшить время обработки вызова на CPU. Время обработки вызова на CPU уменьшается за счет отсутствия посредника-драйвера и за счет параллельного построения буфера команд.
И тут возникает вопрос — а про какое десятикратное увеличение производительности вела речь Apple? Да вот именно про то, что время вызова на CPU теперь сильно меньше. Но вот GPU тут почти не затрагивается, так что в итоге напрямую улучшить графику за счет API Metal увы — нельзя. Но так как освободился процессор — его можно загрузить физикой: обсчетом физики частиц, взаимодействия множества объектов (все помнят сотню летающих обезьян на презентации iPhone 7?), обсчетом эффектов ткани и воды, и так далее. И так как этим раньше занимался GPU, то мы его освобождаем, и получается что косвенно он теперь может выводить лучшую картинку, что мы в играх (в том же Asphalt 8) и видим (обратите внимание на детализацию брусчатки и эффекты):
Взаимодействие OpenGL и Metal
Как видно из вышенаписанного — реально Metal улучшает жизнь процессору. Поэтому если система не поддерживает Metal, но имеет очень мощный процессор, то особого труда переписать игру под OpenGL нет — и именно это мы и видим в Vainglory под Android — для получения максимальной графики (уровень Apple A9) на OpenGL требуется топовый процессор уровня Snapdragon 820, который по голой производительности (во FLOPS-ах) мощнее A9 в два с копейками раза.
Apple Metal 2
На июньской презентации Apple представила новую версию Metal. Основные улучшения — это поддержка VR, машинного обучения и внешних GPU, что в теории позволит портировать под Mac игры с PC без всякого ухудшения графики (на данный момент порты большинства игр представляют собой по сути запуск Wine, что достаточно сильно снижает производительность и очень сильно отражается на и без того достаточно слабых GPU в Mac). Но как это будет реальности — увидим уже только в будущем.
Metal
Accelerating graphics and much more.
Metal provides a platform-optimized, low-overhead API for developing the latest 3D pro applications and amazing games using a rich shading language with tighter integration between graphics and compute programs. To help you do more while managing ever more complex shader code, Metal adds an unparalleled suite of advanced GPU debugging tools to help you realize the full potential of your graphics code.
What’s new
Enhanced graphics and compute integration
To better realize the latest GPU rendering techniques, you can now call dynamic libraries, use function pointers, and leverage the Ray Tracing API directly from your graphics shaders.
Function stitching
Efficiently combine precompiled functions into more complex functions at run time. This allows shader authoring tools to precompile individual shader nodes while maintaining flexibility as they author shaders.
New Ray Tracing features
The Ray Tracing API now supports motion blur, user instance IDs, and an extension of numerical limits to help you generate immensely complex scenes with professional renders.
GPU-accelerated ML training
MPSGraph adds new operations and optimizations using Metal buffer-based ML primitives on the GPU, so you can accelerate ML model training on Mac with higher peak performance.
Metal plugin for TensorFlow
Metal adds support for the PluggableDevice interface for TensorFlow, so you can start training with great performance on macOS Monterey.
GPU Performance State Debugger
Optimize your graphics code for power and performance on all Apple platforms.
Metal Debugger timeline view
To help achieve peak performance with the latest rendering techniques, Metal Debugger now includes performance counters and bottleneck analysis tools while providing a unified view of Metal commands, resources, and buffers on the timeline of GPU events.
Selective Shader Debugger
To dramatically reduce the time it takes to debug incredibly large GPU shader code, Xcode 13 now includes the option to target and debug specific functions within the overall GPU shader code.
GPU Address Sanitizer
Xcode 13 can automatically find difficult bugs, such as buffer overruns, in complex GPU shader code.
Texture Converter Tool
To simplify optimizing game texture assets for Apple platforms, the new Texture Converter Tool supports the latest modern texture formats used by high-end games. For game developers with a Windows-based build environment, the Texture Converter Tool is also available in the Metal Tools for Windows package.
Documentation
Browse the latest documentation, including API reference and articles.
Metal-cpp
Add Metal functionality to graphics apps, games, and game engines using low overhead Metal C++ headers.
Metal Developer Tools for Windows
Bring your high-end games and assets to Mac with the Texture Converter Tool and Metal Shader Compiler.
Sample code
Get sample code to see how Metal APIs are implemented.
Videos
Learn how to take advantage of the latest advancements in Metal.
Forums
Ask questions and discuss Metal with Apple engineers and other developers.
Проверяем Mac на предмет поддержки Metal
Выпуск OS X El Capitan — событие знаковое по целом ряду причин. Новая версия не только получила отличные оценки в App Store благодаря стабильности и скорости работы — ваш покорный слуга удостоверился в этом на устройстве семилетней давности — но и принесла с собой интересные функции, среди которых поддержка известного по iOS 8 интерфейса Metal. Несмотря на умеренные требования ОС к аппаратному обеспечению, новый API доступен не для всех моделей Mac, и проверить его работоспособность проще простого.
По заявлению Apple, новая функция, призванная значительно ускорить графическую составляющую приложений, будет работать со всеми Mac, начиная с выпущенных в 2012 году. Однако своеобразная путаница всё же возникала: поддерживались не все конфигурации, а некоторые пользователи сообщали о работе Metal и на более старых устройствах, например Mac Pro, оснащённых видеокартами Radeon 7-й серии от AMD. Чтобы внести ясность в этот вопрос, разработчики из Fabulous Panda написали специальную утилиту, отображающую статус поддержки Metal компьютером.
Сама программа написана на Java и работает предельно просто: при наличии соответствующего оборудования она выдаст, например, такой результат.
Название: Metaltest for Mac
Издатель/разработчик: Fabulous Panda
Цена: Бесплатно
Встроенные покупки: Нет
Совместимость: OS X 10.11
Ссылка: Установить
По материалам Macnotes.de
Новости, статьи и анонсы публикаций
Свободное общение и обсуждение материалов
Лонгриды для вас
Скачать видео с Youtube или Instagram, разбить PDF файлы на несколько частей или превратить Live Photo в GIF очень удобно с приложением команды на iOS. Мы подобрали для вас только лучшее.
Xiaomi представила кулер ❄ для iPhone 12, который крепится на магнитах MagSafe. Благодаря активному охлаждению он должен оттянуть момент включения троттлинга и продлить работу процессора на максимальной частоте
Наверное, это самый необычный взгляд на дизайн нового Mac Pro, который может быть представлен уже в 2021 году. И хотя выглядит он максимально странно, Apple вполне может выпустить компьютер в таком необычном форм-факторе. Вспомните «мусорное ведро» 2013 года!
Apple Metal: зачем нам еще один API?
На WWDC 2014 всех нас ждал сюрприз: анонс нового графического 3D API под названием Metal. Но на этот раз мы имеем дело не с новым высокоуровневым API поверх OpenGL ES (как было в случае с Scene Kit), а с новым низкоуровневым API для рендеринга и вычислений, которое может служить заменой OpenGL в играх. По словам Apple, Metal может быть до 10 раз быстрее, чем OpenGL ES (точнее говоря — может генерировать вызовы отрисовки [draw calls; передача данных на GPU] в 10 раз быстрее) и доступен только на устройствах с iOS и процессором последнего поколения A7.
В Metal заложено несколько ключевых моментов, позволяющих снизить загрузку CPU, просчитать его производительность в определенных условиях и оптимизировать все процессы:
Этот анонс спровоцировал новую волну обсуждения и споров насчет необходимости появления новых графических API, которые должны (или не должны — кто знает) заменить OpenGL. Предлагаемый вашему вниманию пост не намерен участвовать в этой дискуссии – его целью является разъяснение того, чем все-таки Metal отличается от OpenGL ES, чьей заменой он является. Чтобы понять, что такого особенного (или же наоборот, ничего особенного) есть в Metal API, нам придется немного заглянуть под «капот» графических API и GPU.
Как работают GPU и графические API
Наивный читатель может предположить, что вызов API напрямую делает что-то на GPU или позволяет чему-то происходить внутри GPU. Еще более наивный читатель предполагает, что GPU заканчивает обработку этого вызова, когда API возвращает результат. Оба этих утверждения далеки от реальности. Если бы драйвер выполнял команды рендеринга в тот же момент, когда они были созданы и ждал бы завершения процесса рендеринга перед возвращением результата в вызов API, то ни CPU, ни GPU не могли бы работать эффективно, поскольку один из процессоров всегда был бы заблокирован в угоду другому.
Для простого улучшения в работе GPU этот процесс стоит запустить асинхронно; тогда GPU не будет блокировать CPU и вызовы API будут возвращать результат почти мгновенно. В этом случае GPU возможно не будет использоваться на все 100%, поскольку ему возможно придется ждать от CPU новых вызовов рендеринга (= начала кадра), в то время как вызовы остальных команд будут ждать завершения предыдущих. Это становится причиной того, почему большинство графических драйверов собирают все вызовы отрисовки (и другие задачи, которые нужно будет выполнить на GPU — например, изменение состояний) для отрисовки всего кадра перед отправкой его на GPU. Эти буферизованные команды будут затем отосланы обратно после того, как будет получена команда для отрисовки следующего кадра, благодаря чему GPU будет использоваться настолько эффективно, насколько это возможно. Конечно, это добавит один кадр задержки: пока CPU будет создавать задание для текущего фрейма, прошлый фрейм будет рендериться на GPU. На самом деле, можно буферизовать больше одного кадра и таким образом добиваться большей частоты смены кадров — за счет еще большей задержки.
Другая ошибка в нашем наивном предположении состоит в предположении о том, чем занимаются вызовы изменения состояний.
Итак, мы узнали как минимум две важные вещи о том, что происходит за сценой совместной работы OpenGL с современными GPU: изменение состояний может быть сложным, если требуется новая комбинация состояний и все операции на GPU будут задержаны на некоторое количество времени.
В приложении один поток актуальных команд для одного кадра, которые надо выполнить на GPU, формируется и отправляется на GPU сразу весь за один раз (на самом деле все немного сложнее, но давайте не будет пока углубляться).
Подробнее прочитать о том, как работает современный пайплайн компьютерной графики вы можете в серии статей Fabian Giesens — «A trip down the Graphics Pipeline».
Почему у другой программной модели могут быть преимущества
Как вы уже увидели, от программиста спрятано огромное количество сложностей и хитрых трюков (их наверняка еще больше, чем я упомянул), которые прячут то, что непосредственно происходит. Одни из них делают жизнь простого разработчика проще, другие — заставляют его искать способы обхитрить драйвер или «копать» в сторону побочных эффектов работы вызовов API.
Некоторые графические API сегодня пытаются убрать большую часть этих трюков, раскрывая скрываемую ими «запутанность» – и в некоторых случаях оставляя на волю программы решение всех связанных проблем. В этом направлении шли графические API PS3, в нем же идет AMD со своим Mantle, туда же собираются грядущие DirectX 12 и Apple Metal.
Что же изменилось?
Буферы команд теперь открыты и приложение должно заполнять эти буферы и отправлять их в очередь команд, которая будет выполнять эти буферы в заданном порядке на GPU — таким образом, приложение будет иметь полный контроль над заданием, отправляемым на GPU, и определять, сколько кадров задержки необходимо добавить (добавляя задержку, но при этом увеличивая степень используемости GPU). Буферизация команд на GPU и отправка их асинхронно в следующий фрейм должна быть реализована самим приложением.
Поскольку становится ясно, что эти буферы не будут выполняться прямо сразу (то есть во время создания) и что множественные буферы могут быть созданы и добавлены в очередь на выполнение в определенном порядке, приложение может позволить себе их построение в нескольких потоках в параллели. Также для программиста становится более очевидным, какие из результатов вычислений уже доступны, а какие — нет.
Изменения состояний теперь организованы в объекты состояний, которые могут просто переключаться, в то время как создание этих объектов будет обходиться дороже. Например, MTLRenderPipelineState содержит шейдеры и все состояния, которые реализованы их патчингом.
Другой плюс от нового API в том, что оно не обязано нести груз совместимости с предыдущими версиями и поэтому не будет таким консервативным.
Есть нюанс и в заточке под A7 — благодаря ему Metal заточен под работу на системах с общей памятью, т.е. CPU и GPU могут получать прямой доступ к одним данным без необходимости перебрасывать их по шине PCI. Metal дает прямой доступ для программы к буферам из CPU, и ответственность за то, что эти данные не используются одновременно и GPU, ложится на плечи программиста. Эта полезная функция позволяет смешивать произведение вычислений на GPU и CPU.
И как это в 10 раз быстрее?
Каждый вызов отрисовки стоит сколько-то времени на CPU и сколько-то времени на GPU. Metal API уменьшает время, затрачиваемое CPU, благодаря упрощению контроля за состояниями и благодаря этому уменьшению числу проверок на ошибки от драйвера на правильность комбинаций состояний. Еще помогает предварительное вычисление состояний: можно не просто выполнять проверку на ошибки во время билда, но и само изменения состояния потребует меньшее количество вызовов API. Возможность параллельного построения буферов команд еще больше увеличивает число вызовов отрисовки в том случае, если приложение привязано к CPU.
А вот рендеринг на GPU с другой стороны быстрее не становится, приложение которое делает совсем немного вызовов отрисовки для больших мешей (меш — часть модели, состоящая из вершин объекта) не получит никакого преимущества от перехода на Metal.
Может ли то же самое быть сделано на OpenGL?
На GDC 14 была отличная презентация «Approaching Zero Driver Overhead» за авторством Cass Everitt, John McDonald, Graham Sellers и Tim Foley. Основной ее идеей было уменьшение работы драйвера в OpenGL при помощи увеличения количества работы, производимым вызовов отрисовки, и использованием новых объектов GL и меньшего количества числа вызовов GL для повышения эффективности.
Эта и другие идеи потребуют дальнейшего расширения OpenGL и появления новых версий этого API, но многое из этого можно будет перенести в OpenGL ES. Что мы потеряем — так это возможность прямого управления командными буферами, со всеми своими «за» и «против».
Какова вероятность увидеть это в будущем? Из-за поддержки обратной совместимости, остается надеяться только на появление некоего набора функций, который можно будет назвать «современное ядро», но и его скорее всего придется сделать совместимым со всем вплоть до оригинальной функции glBegin(). Это ограничение будет действовать на протяжении всего потенциального будущего OpenGL и станет пределом его эволюции, делая альтернативы вроде Metal API все более предпочитаемыми…
iOS 8: Приступаем к работе с Metal
В этом уроке вы узнаете, как начать работу с технологией Metal, представленной в iOS 8, которая поддерживает ускоренную 3D-рендеринг графических изображений и параллельные вычислительные нагрузки данных. В этом уроке мы рассмотрим теоретические концепции, которые лежат в основе Metal. Вы также узнаете, как создать приложение Metal, которое устанавливает необходимое состояние оборудования для графики, комментирует команды для выполнения в графическом процессоре и управляет буферами, объектами текстур и предварительно скомпилированными шейдерами.
1. Но сначала
В этом руководстве предполагается, что вы знакомы с языком Objective-C и имеете некоторый опыт работы с OpenGL, OpenCL или сопоставимым графическим API.
Он также требует физического устройства с процессором Apple A7 или A8. Это означает, что вам понадобятся iPhone 5S, 6 или 6 Plus или iPad Air или mini (2-го поколения). IOS Simulator даст вам ошибки компиляции.
Этот учебник ориентирован только на Metal, и он не будет охватывать Metal Shading Language. Мы создадим шейдер, но мы рассмотрим только основные операции для взаимодействия с ним.
Если вы используете Xcode в первый раз, убедитесь, что вы добавили свой Apple ID в раздел Accounts в Preferences Xcode. Это обеспечит отсутствие проблем при развертывании приложения на вашем устройстве.
Xcode 6 включает в себя шаблон проекта для Metal, но чтобы помочь вам лучше понять Metal, мы собираемся создать проект с нуля.
В заключительной заметке мы будем использовать Objective-C в этом учебнике, и важно, чтобы у вас было базовое понимание этого языка программирования.
2. Введение
Metal имеет следующие функции:
Достаточно с теорией, пришло время понять, как создается Metal приложение.
3. Создание Metal приложения
Metal приложение характеризуется набором необходимых шагов для корректного представления данных на экране. Эти шаги обычно создаются по порядку, и некоторые ссылки передаются от одного к другому. Эти шаги:
Шаг 1: Получить устройство
Шаг 2. Создание очереди команд
Шаг 3: Создание ресурсов
Этот шаг включает создание ваших буферных объектов, текстур и других ресурсов. В этом уроке вы создадите вершины. Эти объекты хранятся на стороне сервера / графического процессора и для связи с ними вам необходимо создать определенную структуру данных, которая должна содержать аналогичные данные для тех, которые доступны в объекте вершины.
Например, если вам нужно передать данные для двумерной вершинной позиции, вы должны объявить одну структуру данных, содержащую объект для этой 2D-позиции. Затем вы должны объявить его как на клиенте, в приложении iOS, так и на стороне сервера, Metal шейдере. Взгляните на следующий пример для пояснения.
Обратите внимание, что вам нужно импортировать библиотеку GLKMath из фреймворка GLKit, как показано ниже.
Затем вы объявляете объект с правильными координатами.
Шаг 4. Создание пайплайна рендеринга
Создание конвейера рендеринга, вероятно, самый сложный шаг, так как вы должны позаботиться о нескольких инициализациях и конфигурациях, каждая из которых проиллюстрирована на следующей диаграмме.
Конвейер рендеринга настраивается с использованием двух классов:
Обратите внимание, что вам не нужно создавать все объекты конвейера рендеринга. Вы должны просто создать те, которые отвечают вашим потребностям.
На данный момент вы создали дескриптор, но вам все равно нужно настроить его, по крайней мере, в формате пикселей. Это то, что мы делаем в следующем блоке кода.
Для более сложных приложений вам также необходимо установить вершинные и фрагментарные шейдеры по умолчанию, как показано ниже.
Шаг 5: Создайте представление
4. Отрисовка Metal приложения
Теперь, когда мы инициализировали необходимые объекты, нам нужно начать рисовать что-то на экране. Как и при инициализации, вам нужно выполнить несколько шагов:
Шаг 1: Получить буфер команд
Шаг 2: Запустите прохождение Render Pass
В Metal конфигурация рендеринга сложна, и вам нужно явно указать, когда начинается рендер и когда он заканчивается. Для того, чтобы iOS правильно настроил аппаратное обеспечение для этой конкретной конфигурации, вам нужно сперва определить конфигурации фреймбуффа.
Для тех, кто знаком с OpenGL и OpenGL ES, этот шаг аналогичен, так как фреймбуфер имеет те же свойства, что и настройки Color Attachment (от 0 до 3), Depth и Stencil. Вы можете увидеть визуальное представление этого шага на диаграмме ниже.
Сначала вам нужно создать текстуру для рендеринга. Текстура создается из класса CAMetalDrawable и использует метод nextDrawable для извлечения следующей текстуры для рисования в списке.
Этот вызов nextDrawable может и будет узким местом вашего приложения, поскольку он может легко заблокировать ваше приложение. Процессор и графический процессор могут быть деинхронизированы, и один должен ждать другого, что может вызвать оператор блока. Существуют синхронные механизмы, которые могут и должны всегда выполняться для решения этих проблем, но я не буду освещать их в этом вводном учебнике.
Теперь, когда у вас есть текстура для рендеринга, вам нужно создать объект MTLRenderPassDescriptor для хранения информации фреймбуфера и текстуры. Взгляните на следующий фрагмент кода, чтобы узнать, как это работает.
На первом этапе создается текстура для рисования. Второй определяет конкретное действие, которое необходимо предпринять, в этом случае очистка текстуры и предотвращение загрузки содержимого этой текстуры в кеш GPU. Заключительный шаг изменяет цвет фона на определенный цвет.
Шаг 3: Рисуем
Шаг 4: Заблокируйте буфер команд
Теперь у нас есть буфер и инструкции, ожидающие в памяти. Следующим шагом является передача команд в буфер команд и просмотр графики, нарисованной на экране. Обратите внимание, что GPU будет выполнять только код, который вы специально совершили для эффекта. Следующие строки кода позволяют планировать фреймбуфер и передавать командный буфер на GPU.
На этом этапе у вас должно быть общее представление о том, как структурировано приложение Metal. Однако, чтобы правильно понять все это, вам нужно сделать это самостоятельно. Пришло время запрограммировать ваше первое приложение Metal.
5. Создание приложения Metal
Запустите Xcode 6 и выберите New > Project. в меню File. Выберите Single View Application из списка шаблонов и выберите имя продукта. Установите Objective-C в качестве языка и выберите iPhone в меню Devices.
Откройте ViewController.m и добавьте следующие операторы импорта вверху.
6. Создание структуры Metal
Вы также должны установить прозрачность представления, цвет фона и коэффициент масштабирования контента. Это показано в следующем фрагменте кода.
Шаги, которые нам нужно предпринять для рендеринга кадра:
Не стесняйтесь пересматривать то, что мы видели до сих пор, чтобы решить эту задачу самостоятельно. Если вы хотите продолжить этот учебник, ознакомьтесь с приведенным ниже решением.
7. Рисование треугольника
Не забудьте добавить оператор import для библиотеки GLKMath в верхней части ViewController.m.
Метод viewDidLoad завершен, но нет последнего шага, создающего шейдеры.
8. Создание шейдеров
Чтобы создать металлический шейдер, выберите New > File. в меню File, выберите Source > Metal File в разделе iOS и назовите его MyShader. Затем Xcode создаст для вас новый файл MyShader.metal.
Поскольку они должны взаимодействовать однонаправленно, от вершины к фрагменту, лучше всего создать структуру для данных, которые будут переданы. В этом случае мы занимаем только позицию.
Что это значит? Вы можете создавать свои шейдеры и называть их по своему усмотрению, но вам нужно вызвать методы точно так же, как вы их объявляете, и они должны иметь уникальные имена.
Внутри шейдеров добавьте следующий блок кода.
Вот и все. Создавайте и запускайте приложение и наслаждайтесь своим первым, новым 60-секундным Metal приложением.
9. Внешние ресурсы
Если вы хотите узнать больше о фреймворке Metal и как он работает, вы можете проверить несколько других ресурсов:
Заключение
Это завершает наш вводный учебник по новому фреймворку Metal. Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь оставлять их в комментариях ниже.