
ballMaterial.diffuse.contents = UIImage(named: ballTexture)ballMaterial.doubleSIDed = trueballGeometry.materials = [ballMaterial]
目前的ballTexture是一个半透明的纹理,因为我希望看到背面滚动.
然而,我得到一些奇怪的剔除,即使doubleSIDed属性设置为true,也只显示一半背面多边形.
任何帮助将不胜感激,谢谢.
解决方法 发生这种情况是因为透明度的影响取决于绘制顺序. SceneKit不知道在面向正面之前绘制球体的背面多边形. (实际上,如果没有为每个帧重新组织GPU上的顶点缓冲区,它就无法真正做到这一点,这将对渲染性能产生巨大的影响.)SCNSphere的顶点布局使其设置为地球上的纬度/长度网格:三角形沿着0°到360°的子午线顺序渲染,因此取决于球体相对于摄像机的方向,球体远端的面部将在较近的面部之前呈现.
要解决此问题,您需要直接或通过深度缓冲区强制渲染顺序.这是一种方法,使用内部表面的单独材料来说明差异.
// add two balls,one a child of the otherlet 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 outsIDelet mat1 = node.geometry!.firstMaterial!mat1.cullMode = .Backmat1.transparent.contents = bwCheckers// my "bwCheckers" uses black for transparent,white for opaquemat1.transparencyMode = .RGBZero// cull front-facing polygons on the second ball// so we only see the insIDelet mat2 = node2.geometry!.firstMaterial!mat2.cullMode = .Frontmat2.diffuse.contents = rgCheckers// sphere normals face outward,so to make the insIDe respond// to lighting,we need to invert themlet shader = "_geometry.normal *= -1.0;"mat2.shaderModifIErs = [SCNShaderModifIErEntryPointGeometry: shader]
(最后的着色器修改器位不是必需的 – 它只是使内部材质得到漫反射着色.您也可以使用不涉及法线或光照的材质属性,如发射,具体取决于您想要的外观.)
您也可以通过禁用writesToDepthBuffer使用具有双面材质的单个节点来执行此 *** 作,但这也可能导致与场景内容的其余部分进行不良交互 – 在这种情况下您可能还需要使用renderingOrder.
以上是内存溢出为你收集整理的ios – 在SceneKit中进行背面剔除全部内容,希望文章能够帮你解决ios – 在SceneKit中进行背面剔除所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)