修复语法错误和渲染不显示与雷文德利希金属第 2 部分教程



我正在尝试学习金属,突然我遇到了语法错误。我想知道为什么这个人试图添加一个不安全的可变指针,但这无关紧要。我尝试移动这些东西,这样它就不会尝试添加 int 和 UnsafeMutablePointer,但立方体完全消失了。

本教程似乎有一个编程语法错误,并将原因移动到不同的参数中,或者这根本没有帮助(它会擦除所有内容(。(这不是因为语言更新(。

项目的 Gitlab(我将把它保留在一个文件中(,问题在 67 左右。代码如下所示:

memcpy(bufferPointer + MemoryLayout<Float>.size * Matrix4.numberOfElements(), projectionMatrix.raw(), MemoryLayout<Float>.size * Matrix4.numberOfElements())

如果您想仔细查看整个文件的上下文,这里是 Gitlab 链接:

let bufferPointer = uniformBuffer?.contents()
memcpy(bufferPointer, nodeModelMatrix.raw(), MemoryLayout<Float>.size * Matrix4.numberOfElements())
//come back to here
memcpy(bufferPointer + MemoryLayout<Float>.size * Matrix4.numberOfElements(), projectionMatrix.raw(), MemoryLayout<Float>.size * Matrix4.numberOfElements())

这是由于 Metal API 在 Swift 4 和 iOS 11 左右发生的微妙变化。

-newBufferWithLength:options:方法的返回类型从nonnull id<MTLBuffer>更改为nullable id<MTLBuffer>。结果,Swift "覆盖"中相应makeBuffer(length:options:)方法的返回类型从MTLBuffer更改为MTLBuffer?

因此,如果对此 API 返回的值使用可选链接,则contents()方法将返回一个UnsafeMutableRawPointer?,而不是您想要的内容,即UnsafeMutableRawPointer。如果改为使用强制解包来确保从设备获取非 nil 缓冲区,则所有指针算术类型检查都可以。

几点加分:

  • 这不是原始文章中的语法错误,而是将 Swift 3 代码迁移到 Swift 4 而没有完全考虑 API 更改的结果。
  • UnsafeMutableRawPointer添加Int是完全有效的:它将指针偏移该数量的字节,从而产生另一个UnsafeMutableRawPointer

最新更新