gpt4 book ai didi

找不到 iOS Metal 默认库

转载 作者:搜寻专家 更新时间:2023-10-30 22:03:45 25 4
gpt4 key购买 nike

我尝试在一个简单的应用程序中使用 iOS Metal,但是当我调用 device.newDefaultLibrary() 函数时,我在运行时遇到错误:

/BuildRoot/Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.7/Framework/MTLLibrary.mm:1842: failed assertion `Metal default library not found'

有人知道问题出在哪里吗?我遵循了本教程:https://www.raywenderlich.com/77488/ios-8-metal-tutorial-swift-getting-started代码有点旧,但稍作改动就可以了。这是我的 View Controller 代码:

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

}

我使用装有 iOS 9.3 的 iPhone 5s 设备进行测试。

最佳答案

仅当您在应用目标的编译源构建阶段中至少有一个 .metal 文件时,默认库才会包含在您的应用中。我假设您已经按照教程中的步骤创建了 Metal 着色器源文件并添加了顶点和片段函数,因此您只需在构建阶段设置中使用 + 图标来添加该文件到您的编译阶段:

Compile Sources Build Phase

关于找不到 iOS Metal 默认库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36204360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com