gpt4 book ai didi

ios - SceneKit 中的背面剔除

转载 作者:搜寻专家 更新时间:2023-10-31 21:51:50 25 4
gpt4 key购买 nike

我目前正在尝试在场景套件中设置一个旋转球。我创建了球并为其应用了纹理。

ballMaterial.diffuse.contents = UIImage(named: ballTexture)
ballMaterial.doubleSided = true
ballGeometry.materials = [ballMaterial]

当前的 ballTexture 是一个半透明的纹理,因为我希望看到背面滚动。

然而,我得到了一些奇怪的剔除,即使 doubleSided 属性设置为 true,也只显示了背面多边形的一半。

如有任何帮助,我们将不胜感激。

最佳答案

发生这种情况是因为透明度的效果取决于绘制顺序。 SceneKit 不知道在前面的多边形之前绘制球体的背面多边形。 (事实上​​ ,如果不为每一帧重新组织 GPU 上的顶点缓冲区,它就无法真正做到这一点,这将极大地拖累渲染性能。)

SCNSphere 的顶点布局设置得像地球上的纬度/经度网格:三角形沿着从 0° 到 360° 的子午线按顺序呈现,因此取决于球体相对于相机定向,球体远端的一些面会先于较近的面渲染。

要解决此问题,您需要强制渲染顺序 — 直接或通过深度缓冲区。这是一种实现方法,对内表面使用单独的 Material 来说明差异。

// add two balls, one a child of the other
let node = SCNNode(geometry: SCNSphere(radius: 1))
let node2 = SCNNode(geometry: SCNSphere(radius: 1))
scene.rootNode.addChildNode(node)
node.addChildNode(node2)

// cull back-facing polygons on the first ball
// so we only see the outside
let mat1 = node.geometry!.firstMaterial!
mat1.cullMode = .Back
mat1.transparent.contents = bwCheckers
// my "bwCheckers" uses black for transparent, white for opaque
mat1.transparencyMode = .RGBZero

// cull front-facing polygons on the second ball
// so we only see the inside
let mat2 = node2.geometry!.firstMaterial!
mat2.cullMode = .Front
mat2.diffuse.contents = rgCheckers

// sphere normals face outward, so to make the inside respond
// to lighting, we need to invert them
let shader = "_geometry.normal *= -1.0;"
mat2.shaderModifiers = [SCNShaderModifierEntryPointGeometry: shader]

2-sided ball

(末尾的着色器修改位不是必需的——它只是让内部 Material 获得漫反射着色。您也可以使用不涉及法线或光照的 Material 属性,例如 emission,取决于你想要的外观。)

您也可以通过禁用 writesToDepthBuffer 使用具有双面 Material 的单个节点来执行此操作,但这也可能导致与场景其余内容的不良交互——您可能还需要弄乱 renderingOrder在那种情况下。

关于ios - SceneKit 中的背面剔除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34144056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com