2016-03-24 2 views
4

が見つかりません:iOSのメタル・デフォルト・ライブラリは、私はシンプルなアプリでiOSの金属を使用してみましたが、私は、その後device.newDefaultLibrary()関数を呼び出すとき、私は、実行時にエラーが発生します

/BuildRoot /ライブラリ/キャッシュ/ com.apple.xbs /ソース/金属/金属-56.7 /フレームワーク/ MTLLibrary.mm:1842: 「が見つかりません主張 `メタル・デフォルト・ライブラリーを失敗した

たことのある人問題でどのようなクラウド任意のアイデア?私はこのチュートリアルに従いました:https://www.raywenderlich.com/77488/ios-8-metal-tutorial-swift-getting-started コードは少し古くなっていますが、小さな変更でうまくいきます。私はテストのためのiOS 9.3とiPhone 5Sデバイスを使用

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() 
     } 
    } 

} 

:ここに私のViewControllerコードです。

+0

あなたは運動場でこれをしようとしている場合は特に、ライブラリのための独自のファイルパスを作成する必要があります。それを修正する方法について[私のチュートリアル](http://mhorga.org/2016/03/07/using-metalkit-part-8.html)を見てください。 – Marius

+0

@マリアスは、OPが彼がオンデバイスで走っていたことを示していたので、ここではそれが関係があるとは確信していません。シェーダファイルが単にアプリケーションバンドルにコンパイルされていないように見えます。 – warrenm

+0

@warrenmあなたが正しいです、私は質問の最後にその詳細を逃した。 – Marius

答えて

7

デフォルトターゲットライブラリは、アプリターゲットのコンパイルソースビルドフェーズに少なくとも1つの.metalファイルがある場合にのみアプリに含まれます。私は、Metal Shaderのソースファイルを作成し、頂点とフラグメントの関数を追加したチュートリアルの手順に従ったと仮定します。そのため、ビルドフェーズ設定で+アイコンを使用するだけで、そのファイルをコンパイルフェーズに追加するだけです。

Compile Sources Build Phase

関連する問題