是什么原因导致SceneKit几何体的部分从不同角度观看时"弹出"?

Mic*_*l T 5 3d xcode ios scenekit

我在使用3D时相当新手,但我会尽力解释我的情况.

我正在将一些模型(来自Maya的DAE)导入到使用半透明材质的SceneKit(XCode 9)中.在这个特定情况下,我将参考一个灯泡模型.当直接观察模型时,通过外部"玻璃"层可以看到内部的灯丝. 在此输入图像描述 当我沿x轴转动模型时,即使只是轻微,灯丝也会消失. 在此输入图像描述

我在其他情况下注意到这种行为,其中几何包含在具有半透明材质的其他几何体中.我也在使用基于物理的照明.有人遇到过这种情况么?先感谢您.

ric*_*ter 8

在第二张图片中,您的灯泡烧坏了.你应该去五金店买一个新的灯泡.

好的,认真的......

3D渲染的透明度需要特别小心.通常,当SceneKit(或任何图形技术,真的)呈现不透明对象时,它会在渲染目标中写入两个输出:一个用于颜色,一个用于深度.在渲染过程中获得深度信息意味着不透明对象正确地出现在彼此的前面或后面,无论它们呈现的顺序如何,并且能够进行一些性能优化.

例如,如果我画茶壶,然后在茶壶周围画一套茶杯,GPU可以快速决定是否保留茶壶的彩色像素,或者根据茶杯的相对深度用茶杯中的像素替换它们.(如果深度测试表明它不需要某些像素,则不需要浪费时间渲染它们.

但深度测试仅适用于不透明对象.对于半透明对象,您必须管理渲染顺序.如果您希望一个对象的像素在另一个对象的顶部混合,则首先渲染不透明的东西和距离相机最远的透明物体,最后最接近相机的透明物体.

SceneKit有一些用于管理渲染顺序的技巧,但在你的情况下有一个额外的皱纹:你有一个半透明的表面,所以表面的一部分需要在其他部分前面渲染,哪些部分取决于相对于相机.像SceneKit这样的高级场景图框架通常对它们没有多大帮助,因为它们会同时渲染网格中的所有三角形,因此你会被它们定义的任何顺序所困扰,导致你在左边看到的情况在下图中.

来自SceneKit WWDC17的透明模式

但是,iOS 11中的SceneKit(以及tvOS 11和macOS 10.13 High Sierra,也可能是watchOS 4)都有一个解决方案.看看新的透明度模式:如果使用该dualLayer设置,SceneKit会自动将透明曲面分成两个渲染过程,一个用于背面,另一个用于前面.这不仅可以确保网格中的三角形相互正确混合,而且放在对象内部的任何内容也会正确混合.

这里很好地解释了WWDC17在SceneKit上的讲话(上面的图片来自).

对于您的灯泡,您可能还需要检查writesToDepthBuffer某些材料的属性.