Я создаю iOS SDK для инструмента, который разрабатываю. Теперь у меня проблемы с Металлом.
У меня есть опыт программирования, но (пока) не очень большой со Swift/Metal, поэтому у меня проблемы
Итак, я:
[*]создал новую iOS Framework, добавленную в металлический файл под названием «Shaders.metal». [*]Добавлен файл Shaders.metal в мою цель (его можно увидеть на этапах сборки) [*]Добавлены 3 функции vertexMain/fragmentMain/blurFragmentMain (код позже) [*]У меня есть основной класс Swift, в котором я пытаюсь инициализировать свое устройство, и MTLRenderPipelineDescriptor [*]Я создал тестовый проект SwiftUI и связал с этим приложением другую свою платформу. Все работает кроме металлической части. Может там что-то не так? Нужно ли мне его скомпилировать?
Теперь все идет не так, я не могу создать библиотеку по умолчанию, используя
guard let Library = попробовать? metalDevice.makeDefaultLibrary(bundle: frameworkBundle) else { FatalError("Не удалось создать библиотеку по умолчанию") } Я получаю сообщение об ошибке
Ошибка: Error Domain=MTLLibraryErrorDomain Code=6 «библиотека по умолчанию не найдена» Полный код здесь:
// // Шейдеры.металл // #include #include использование металла пространства имен; vertex float4 vertexMain(constant float4* vertices [[buffer(0)]], uint vertex_id [[vertex_id]]) { вернуть вершины[vertex_id]; } фрагмент half4 фрагментMain() { вернуть половину4(1.0); // Это просто возвращает белый цвет. Мы заменим это позже. } фрагмент half4 BluFragmentMain(texture2d inputTexture [[texture(0)]], sampler s [[sampler(0)]], float2 texCoord [[stage_in]]) { // Выборка нескольких пикселей вокруг texCoord и их усреднение // Это упрощенная версия; настоящий шейдер размытия был бы более сложным half4 color = inputTexture.sample(s, texCoord); вернуть цвет; } импортировать металл импортировать МеталКит импортный фонд импортировать UIKit импортировать Аламофайр общественный класс MetalExample { частный вар metalDevice: MTLDevice! частная переменная CommandQueue: MTLCommandQueue! частный вар PipelineState: MTLRenderPipelineState? общественная инициализация () { если let metalDevice = MTLCreateSystemDefaultDevice() { self.metalDevice = metalDevice } если metalDevice == ноль { print("Устройство равно нулю!") } еще { print("Устройство не равно нулю.") } CommandQueue = metalDevice.makeCommandQueue()! let frameworkBundle = Bundle(для: type(of: self)) охранник пусть библиотека = попробовать? metalDevice.makeDefaultLibrary(bundle: frameworkBundle) else { FatalError("Не удалось создать библиотеку по умолчанию") } Guard let vertexFunction = Library.makeFunction(name: "vertexMain") else { FatalError("Не удалось загрузить функцию вершины") } Guard let фрагментFunction = Library.makeFunction(name: "fragmentMain") else { FatalError("Не удалось загрузить функцию фрагмента") } // Создаем дескриптор конвейера пусть конвейерDescriptor = MTLRenderPipelineDescriptor() конвейерDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm PipeDescriptor.vertexFunction = vertexFunction конвейерныйдескриптор.фрагментфункция = фрагментфункция // Создаем состояние конвейера делать { PipelineState = попробуйте metalDevice.makeRenderPipelineState (дескриптор: PipelineDescriptor) } ловить { print("Ошибка создания состояния конвейера: \(ошибка)") } } Подфайл моего тестового приложения
# Раскомментируйте следующую строку, чтобы определить глобальную платформу для вашего проекта. # платформа: iOS, '9.0' цель «X_Test_App» сделать # Прокомментируйте следующую строку, если вы не хотите использовать динамические фреймворки используйте_frameworks! pod 'X_iOS_SDK', :path => '../X-ios-sdk' # Модулей для X_Test_App конец Я гуглил и искал это несколько дней, но не могу найти... Может кто-нибудь мне помочь?
Мобильная версия