未找到金属“纹理”

Posted

技术标签:

【中文标题】未找到金属“纹理”【英文标题】:Metal 'texture' not found 【发布时间】:2017-06-14 10:52:48 【问题描述】:

对于基于 Metal 的 ImageView 的每一个实现,我都面临着同样的问题

let targetTexture = currentDrawable?.texture else return 

“MTLDrawable”类型的值没有成员“纹理”

好像苹果改变了一些金属api

这是我尝试使用的完整功能:

func renderImage()

    guard let
        image = image,
        let targetTexture = currentDrawable?.texture elsereturn

    let commandBuffer = commandQueue.makeCommandBuffer()

    let bounds = CGRect(origin: CGPoint.zero, size: drawableSize)

    let originX = image.extent.origin.x
    let originY = image.extent.origin.y

    let scaleX = drawableSize.width / image.extent.width
    let scaleY = drawableSize.height / image.extent.height
    let scale = min(scaleX, scaleY)

    let scaledImage = image
        .applying(CGAffineTransform(translationX: -originX, y: -originY))
        .applying(CGAffineTransform(scaleX: scale, y: scale))

    ciContext.render(scaledImage,
                     to: targetTexture,
                     commandBuffer: commandBuffer,
                     bounds: bounds,
                     colorSpace: colorSpace)

    commandBuffer.present(currentDrawable!)

    commandBuffer.commit()

【问题讨论】:

显示currentDrawable 变量的声明和赋值。根据错误,它是MTLDrawable 类型,实际上没有texture 属性。我想你在想CAMetalDrawable,确实如此。 @KenThomases 但在每个实现中,金属套件视图都是以这种方式完成的,并且无法从 MTLDrawable 调用 CAMetalDrawable 你在实现MTKView的子类吗? 【参考方案1】:

在执行系统和 xcode 更新后,我遇到了同样的问题。结果在更新过程中,xcode 将构建目标切换到了模拟器。一旦我将目标切换回设备,它就会再次编译。

【讨论】:

成功了,谢谢。但是为什么它变得如此愚蠢,这是苹果的问题【参考方案2】:

Metal 不适用于模拟器,但如果您只是希望构建通过并专注于应用程序的其他区域,您可以尝试执行类似以下操作: 对于那些仍然想在模拟器上运行的人,有一个解决方法至少可以让它运行和编译(虽然没有 Metal 功能)

https://navoshta.com/metal-camera-bonus-running-simulator/

【讨论】:

以上是关于未找到金属“纹理”的主要内容,如果未能解决你的问题,请参考以下文章

使用 3D 类型初始化金属纹理

闪烁的金属输出纹理...为啥?

金属着色器纹理读取与示例

如何在金属中使用一系列纹理

如何在 SceneKit 中显示金属和透明纹理?

如何让 SKSpriteNode 不旋转纹理