【问题标题】:SceneKit CALayer unsharp drawingSceneKit CALayer 锐化绘图
【发布时间】:2023-04-19 09:16:01
【问题描述】:

我正在尝试绘制 UIBezierPaths 并将它们显示在 SCNPlane 上,尽管我得到了一个非常不清晰的结果 (See in the image) 我怎样才能使它更清晰?

let displayLayer = CAShapeLayer()
  displayLayer.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
  displayLayer.path = path.cgPath
  displayLayer.fillColor = UIColor.clear.cgColor
  displayLayer.strokeColor = stroke.cgColor
  displayLayer.lineWidth = lineWidth
  let plane = SCNPlane(width:size.width, height: size.height)
  let material = SCNMaterial()
  material.diffuse.contents = displayLayer
  plane.materials = [material]
  let node = SCNNode(geometry: plane)

我尝试增加 displayLayer.frame 的大小,但它只会让事情变得更小。

感谢您的回答! 安德拉斯

【问题讨论】:

  • 更改图层的框架是个好主意,因为它会导致更大的纹理来映射对象。您需要将 Bézier 路径缩放相同的数量,以使其显示为相同的大小。

标签: ios core-animation calayer scenekit cashapelayer


【解决方案1】:

这让我发疯了,所以希望这个答案能帮助其他偶然发现这个问题的人。我将CALayer 映射到SCNMaterial 纹理以在ARKit 场景中使用,并且一切都是模糊/像素化的。将CALayercontentsScale 属性设置为UIScreen.main.scale 没有做任何事情,也没有玩shouldRasterizerasterizationScale

解决方案是将图层的帧设置为所需的帧,乘以屏幕的比例,否则材质会缩放变换图层以适应纹理。换句话说,图层的大小需要是其所需大小的 3 倍。

let layer = CALayer() layer.frame = CGRect(x: 0, y: 0, width: 500 * UIScreen.main.scale, height: 750 * UIScreen.main.scale)

【讨论】:

    【解决方案2】:

    尝试更改 UIBezierPath 的“平坦度”属性(0.1、0.01、0.001 等)。

    【讨论】:

    • 谢谢,但很遗憾没用,我猜我的渲染有问题。