2016-03-24 3 views
4

Я попытался с помощью IOS металла в простом приложении, но когда я вызвать функцию device.newDefaultLibrary(), то я получаю сообщение об ошибке во время выполнения:IOS металл по умолчанию библиотеки не найден

/BuildRoot/Библиотека/кэша/com.apple.xbs/Источники/металл/металл-56,7/Framework/MTLLibrary.mm: 1842: неудавшейся утверждение `Металл библиотеки по умолчанию не найден»

кто-нибудь какой-либо идеи, что облако быть проблема? Я следовал этому руководству: https://www.raywenderlich.com/77488/ios-8-metal-tutorial-swift-getting-started Код немного старый, но с крошечными изменениями он работает. Вот мой ViewController код:

import UIKit 
import Metal 
import QuartzCore 

class ViewController: UIViewController { 

    //11A 
     var device: MTLDevice! = nil 

     //11B 
     var metalLayer: CAMetalLayer! = nil 

     //11C 
     let vertexData:[Float] = [ 
      0.0, 1.0, 0.0, 
      -1.0, -1.0, 0.0, 
      1.0, -1.0, 0.0] 
     var vertexBuffer: MTLBuffer! = nil 

     //11F 
     var pipelineState: MTLRenderPipelineState! = nil 

     //11G 
     var commandQueue: MTLCommandQueue! = nil 

     //12A 
     var timer: CADisplayLink! = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     //11A 
     device = MTLCreateSystemDefaultDevice() 

     //11B 
     metalLayer = CAMetalLayer()   // 1 
     metalLayer.device = device   // 2 
     metalLayer.pixelFormat = .BGRA8Unorm // 3 
     metalLayer.framebufferOnly = true // 4 
     metalLayer.frame = view.layer.frame // 5 
     view.layer.addSublayer(metalLayer) // 6 

     //11C 
     let dataSize = vertexData.count * sizeofValue(vertexData[0]) // 1 
     vertexBuffer = device.newBufferWithBytes(vertexData, length: dataSize, options: MTLResourceOptions.CPUCacheModeDefaultCache) // 2 

     //11F 
     // 1 
     let defaultLibrary = device.newDefaultLibrary() //The error is generating here 
     let fragmentProgram = defaultLibrary!.newFunctionWithName("basic_fragment") 
     let vertexProgram = defaultLibrary!.newFunctionWithName("basic_vertex") 

     // 2 
     let pipelineStateDescriptor = MTLRenderPipelineDescriptor() 
     pipelineStateDescriptor.vertexFunction = vertexProgram 
     pipelineStateDescriptor.fragmentFunction = fragmentProgram 
     pipelineStateDescriptor.colorAttachments[0].pixelFormat = .BGRA8Unorm 

     // 3 
     do { 
      try pipelineState = device.newRenderPipelineStateWithDescriptor(pipelineStateDescriptor) 
     } catch _ { 
      print("Failed to create pipeline state, error") 
     } 

     //11G 
     commandQueue = device.newCommandQueue() 

     //12A 
     timer = CADisplayLink(target: self, selector: Selector("gameloop")) 
     timer.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    //MARK: Custom Methodes 

    //12A 
    func render() { 

     //12C 
     let commandBuffer = commandQueue.commandBuffer() 

     //12B 
     let drawable = metalLayer.nextDrawable() 

     let renderPassDescriptor = MTLRenderPassDescriptor() 
     renderPassDescriptor.colorAttachments[0].texture = drawable!.texture 
     renderPassDescriptor.colorAttachments[0].loadAction = .Clear 
     renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColor(red: 0.0, green: 104.0/255.0, blue: 5.0/255.0, alpha: 1.0) 

     //12D 
     let renderEncoderOpt = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor) 

     renderEncoderOpt.setRenderPipelineState(pipelineState) 
     renderEncoderOpt.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0) 
     renderEncoderOpt.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1) 
     renderEncoderOpt.endEncoding() 

     //12E 
     commandBuffer.presentDrawable(drawable!) 
     commandBuffer.commit() 

    } 

    func gameloop() { 
     autoreleasepool { 
      self.render() 
     } 
    } 

} 

Я использую устройство iPhone 5s с прошивкой 9.3 для тестирования.

+0

вам нужно создать свой собственный путь к файлу для библиотеки, особенно если вы пытаетесь это детская площадка. взгляните на [мой учебник] (http://mhorga.org/2016/03/07/using-metalkit-part-8.html) о том, как это исправить. – Marius

+0

@ Marius, не уверен, что это так уместно, так как OP указал, что он работает на устройстве. Похоже на то, что файл шейдера просто не компилируется в пакет приложений. – warrenm

+0

@warrenm, вы правы, я пропустил эту деталь в конце вопроса. – Marius

ответ

7

Библиотека по умолчанию включена в ваше приложение только в том случае, если у вас есть хотя бы один файл .metal в фазе сборки источников компиляции приложения. Я предполагаю, что вы выполнили шаги учебника, в котором вы создали исходный файл металлического шейдера и добавили функции вершин и фрагментов, поэтому вам просто нужно использовать значок + в фазе построения, чтобы добавить этот файл на фазу компиляции:

Compile Sources Build Phase

Смежные вопросы