2016-01-07 150 views
3

以下代码在SCNView中生成一个红框。但是,边缘沿着朝向您的侧面/元件的顶部和底部呈锯齿状(如附件所示)。我们的目标是渲染与Minecraft盒子类似的更平滑的边缘。改变摄像头的位置会减少某些边缘的像素化,所以这是一个摄像头角度问题?如果是的话,无论摄像机角度是否可以渲染边缘平滑的盒子?创建更平滑的边缘或以其他方式修复SCNView中的盒子上的锯齿边缘?

例如,将摄像头位置设置为SCNVector3(x: 0.0, y: 0.0, z: 10.0)可有效呈现箱子的2D和清晰的边缘(第二个附件)。

enter image description here enter image description here

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) 
+0

你试过'antialiasingMode'吗? – jtbandes

+0

@jtbandes谢谢,使用'.Multisampling4X'对边缘进行了一些平滑处理,但它们仍然明显模糊不平。其他建议? – Crashalot

+0

看起来是特定于iOS的。我在iOS和OS X操场上运行了这段代码。 OS X版本没有锯齿,即使没有启用多重采样。它在真正的iOS硬件上看起来如何? –

回答

4

正如评论所说,如果你想抗锯齿每一帧设置antialiasingMode。它并不像CoreGraphics那样出色,但它相当不错。但是,它确实增加了一吨的工作量,所以你要烧电池并放慢你的帧率。

在OS X上,默认设置为每帧4倍多采样。在iOS上,默认值不是多重采样,因为它非常昂贵。

幸运的是,我更喜欢的解决方案是打开jittering。这有点像多重采样但很懒惰。当物体移动时,它们通常会呈现(有锯齿),但是当它们停止移动时,渲染器将在背景中运行多达96帧,并平滑掉所有的锯齿。因为没有“96x反锯齿模式”,所以最后的样子比抗锯齿好得多,在硬件快的硬件上,我发现大多数人没有意识到物体移动时质量会发生变化。

+0

哇! Wil,真棒。非常感谢。对于其他人,如果'sceneView'是你的'SCNView'的名字,代码是'sceneView.jitteringEnabled = true'。锯片仍然存在一小段时间,但正如威尔所说,他们大多在一两秒钟后就消失了。 – Crashalot