Ios 在SCNView中创建更平滑的边或以其他方式修复长方体上的锯齿边?

Ios 在SCNView中创建更平滑的边或以其他方式修复长方体上的锯齿边?,ios,swift,3d,scenekit,glkit,Ios,Swift,3d,Scenekit,Glkit,下面的代码在SCNView中生成一个红色框。但是,边缘沿面向您的侧/图元的顶部和底部呈锯齿状(如附件所示)。目标是渲染类似于Minecraft长方体的更平滑的边。更改摄影机位置会减少某些边的像素化,因此这是摄影机角度问题吗?如果是,无论摄影机角度如何,是否可以渲染具有平滑边的长方体 例如,将摄影机位置设置为scinvector3(x:0.0,y:0.0,z:10.0)可以有效地在二维中渲染具有清晰边缘的长方体(第二个附件) 如注释中所述,如果要对每个帧进行抗锯齿,请设置抗锯齿模式。它不如Co

下面的代码在
SCNView
中生成一个红色框。但是,边缘沿面向您的侧/图元的顶部和底部呈锯齿状(如附件所示)。目标是渲染类似于Minecraft长方体的更平滑的边。更改摄影机位置会减少某些边的像素化,因此这是摄影机角度问题吗?如果是,无论摄影机角度如何,是否可以渲染具有平滑边的长方体

例如,将摄影机位置设置为
scinvector3(x:0.0,y:0.0,z:10.0)
可以有效地在二维中渲染具有清晰边缘的长方体(第二个附件)


如注释中所述,如果要对每个帧进行抗锯齿,请设置
抗锯齿模式
。它不如CoreGraphics做得好,但它相当不错。但是,它确实会增加大量的工作负载,因此您需要消耗电池并降低帧速率

在OSX上,默认情况下是每帧4倍多采样。在iOS上,默认情况下没有多重采样,因为它非常昂贵

幸运的是,我更喜欢一种解决方案,那就是打开抖动。这有点像多重采样,但很懒惰。当对象移动时,它们会正常渲染(带有锯齿),但当它们停止移动时,渲染器会在背景中运行96帧,并平滑所有锯齿


最终的外观要比抗锯齿好得多(因为没有“96x抗锯齿模式”),在快速硬件上,我向大多数人展示过它,但他们没有意识到物体移动时质量会发生变化。

你有没有尝试过
抗锯齿模式
?@jtbandes谢谢,使用
。Multisampling4X
稍微平滑了边缘,但它们仍然明显模糊且不平滑。其他建议?似乎是针对iOS的。我在iOS和OSX操场上都运行了这段代码。OSX版本没有锯齿,即使没有启用多采样。在真正的iOS硬件上是什么样子的?和你在屏幕截图上看到的差不多。。。有什么建议吗@HalMueller?我在几个不同的设备上运行了它。添加
.Multisampling4X
大大改善了情况。不过,我认为OpenGLES2渲染器比金属渲染器做得更漂亮,这就需要安装雷达。要切换渲染器,可以使用
SCNView(frame:self.view.frame,options:[SCNPreferredRenderingAPIKey:SCNRenderingAPI.OpenGLES2.rawValue])
,或者编辑您的Info.plist.Whoa!太棒了,威尔。非常感谢。对于其他人,如果
scenview
是您的
SCNView
的名称,则代码为
scenview.jitteringEnabled=true
。锯齿状纹路停留了一小会儿,但正如威尔所说,它们大多在一两秒钟后消失。
    let sceneView = SCNView(frame: self.view.frame)
    self.view.addSubview(sceneView)

    let scene = SCNScene()
    sceneView.scene = scene

    let camera = SCNCamera()
    let cameraNode = SCNNode()
    cameraNode.camera = camera
    cameraNode.position = SCNVector3(x: -3.0, y: 0.0, z: 10.0)

    let ambientLight = SCNLight()
    ambientLight.type = SCNLightTypeAmbient
    ambientLight.color = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)
    cameraNode.light = ambientLight

    let light = SCNLight()
    light.type = SCNLightTypeOmni
    let lightNode = SCNNode()
    lightNode.light = light
    lightNode.position = SCNVector3(x: 0, y: 20, z: 10)

    let cubeGeometry = SCNBox(width: 3.0, height: 3.0, length: 3.0, chamferRadius: 0.0)
    let cubeNode = SCNNode(geometry: cubeGeometry)

    let planeGeometry = SCNPlane(width: 100.0, height: 100.0)
    let planeNode = SCNNode(geometry: planeGeometry)
    planeNode.eulerAngles = SCNVector3(x: GLKMathDegreesToRadians(-90), y: 0, z: 0)
    planeNode.position = SCNVector3(x: 0, y: -0.5, z: 0)

    let redMaterial = SCNMaterial()
    redMaterial.diffuse.contents = UIColor.redColor()
    cubeGeometry.materials = [redMaterial]

    let greenMaterial = SCNMaterial()
    greenMaterial.diffuse.contents = UIColor.greenColor()
    planeGeometry.materials = [greenMaterial]

    let constraint = SCNLookAtConstraint(target: cubeNode)
    constraint.gimbalLockEnabled = true
    cameraNode.constraints = [constraint]
    lightNode.constraints = [constraint]

    scene.rootNode.addChildNode(lightNode)
    scene.rootNode.addChildNode(cameraNode)
    scene.rootNode.addChildNode(cubeNode)
    scene.rootNode.addChildNode(planeNode)