【问题标题】:Rendering Vector graphics using Metal/SpriteKit使用 Metal/SpriteKit 渲染矢量图形
【发布时间】:2022-02-27 11:29:35
【问题描述】:

我希望使用 Metal 将矢量形状 (CGPath) 渲染到屏幕外纹理。但是,正如我所见,使用处理抗锯齿和其他问题的 Metal 绘制粗线非常困难。因此,使用 Metal 绘制任意 CGPath 将涉及大量工作。我在想是否可以使用 SpriteKit(基于 Metal)来实现相同的目标。目前尚不清楚如何使用 SKRenderer 类将任意 CGPath 渲染到 Metal 纹理。

【问题讨论】:

  • 正如你所提到的; SpriteKit 使用金属,所以我不明白为什么会有帮助。对于矢量,我认为最好将矢量几何体细分为三角形,而不是渲染精灵/粒子。至于抗锯齿,您可以控制从无抗锯齿到高质量抗锯齿。
  • @JeshuaLacock 使用 Metal 渲染任意几何图形并不容易,这就是我们拥有 nanoVG 等库来渲染矢量形状的原因(同样有一个 Metal 端口),但并非没有限制。另一方面,SpriteKit 是 Apple 的框架,它在内部使用 Metal 进行渲染,并具有许多其他有趣的功能。
  • 嗯,我没有说更容易,我知道 SpriteKit 是什么。同样,SpriteKit 如何解决您对性能的担忧?
  • 是的,您可以在 spritekit 中进行渲染到纹理。但是,如果“屏幕外纹理”是指渲染到着色器可以使用的 缓冲区,那么不,我认为 spritekit 不能以这种方式渲染到缓冲区。 (或者,我应该说,我在 spritekit 中使用着色器,但我一直无法弄清楚如何写入着色器缓冲区。)如果你想要渲染到纹理的示例,请告诉我,我可以发布一个.
  • 是的,我需要渲染到着色器可以使用的纹理(MTLTexture)。您指的是哪种纹理类型?

标签: ios sprite-kit metal skscene metalkit


【解决方案1】:

以下代码将使用SKSceneCGPath 创建一个MTLTexture

import SpriteKit
import MetalKit

class PathScene: SKScene {
    
    let device = MTLCreateSystemDefaultDevice()!
    
    override func didMove(to view: SKView) {
        
        //This is not needed if you supply your own CGPath
        let bezPath = UIBezierPath(ovalIn: self.frame.insetBy(dx: 50, dy: 50))
        
        let lineNode = SKShapeNode()
        lineNode.path = bezPath.cgPath //Use existing CGPath here
        lineNode.lineWidth = 8.0
        lineNode.strokeColor = UIColor.blue
        lineNode.name = "line"
        
        self.addChild(lineNode)
        
        guard let scene = self.scene else {return}
        
        if let skTexture = self.view?.texture(from: scene) {
            let cgImage = skTexture.cgImage()
            let loader = MTKTextureLoader(device: device)
            let mtlTexture = try! loader.newTexture(cgImage: cgImage, options: nil)
        }
        
    }

}

【讨论】:

  • cgImage 方法的问题是数据从 GPU 传输到 CPU 再返回。我认为需要找到一种基于 SKRenderer 的方法。
  • 您没有在问题中指定它必须保留在 GPU 上,所以我确实回答了您的 OP。
  • 那么可以简单地使用CPU来渲染CGPath,那么基于Metal的方法有什么用呢?
  • 因为渲染是使用 SpriteKit 完成的,就像您想要的那样,它是在引擎盖下使用 Metal 完成的。
  • 我确实否决了你的问题,因为我要求澄清,你告诉我我已经知道的 - SpriteKit 基于 Metal。我特别问了为什么您认为 SpriteKit 会解决您对性能的担忧而您没有回答。另一方面,我花了一些时间试图帮助你,而你却投了反对票来回报我,尽管它确实直接回答了你的 OP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多