我在《金属编程指南》 一书中使用了一个用于iOS的简单Metal程序,但是makeBuffer(bytes:length:options:)
并不按书中所述工作。
下面的相关代码
let vertexData: [Float] = [
0.0, 0.5, 0.0,
-1.0, -0.5, 0.0,
1.0, -0.5, 0.0
]
let dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0])
vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize,
options: [.storageModePrivate]) // error on this line
...
let renderEncoder = commandBuffer?.makeRenderCommandEncoder(
descriptor: renderPassDescriptor)
renderEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
// skipping other setups
renderEncoder?.endEncoding()
将在运行时导致崩溃,这是错误日志:
-[MTLDebugDevice newBufferWithBytes:length:options:]:494: failed assertion `storageModePrivate incompatible with ...WithBytes variant of newBuffer'
但是,如果我在[]
中使用options
作为makeBuffer(bytes:length:options:)
的参数,则该程序可以正常工作:
vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize,
options: []) // this will run
但是为什么会这样呢?
答案 0 :(得分:0)
我也正在阅读《金属编程指南》 这本书,并且遇到了同样的问题。
我通过将存储模式更改为id
来解决它。
我将失败的行更改为:
const postId = this.$route.query.id
此后,我就可以将三角形渲染到手机上。