在使用3D时,我还是个新手,但是我会尽力解释我的情况。
我正在将一些使用半透明 Material 的模型(来自Maya的DAE)导入SceneKit(XCode 9)。在这种特定情况下,我将引用灯泡模型。直接查看模型时,内部的细丝可以通过外部“玻璃”层看到。
当我甚至稍微沿x轴旋转模型时,细丝就会消失。
我注意到在其他情况下这种行为,其中几何包含在使用半透明 Material 的其他几何内。我也在使用基于物理的照明。有人遇到过这种情况么?先感谢您。
最佳答案
在第二张图片中,您的灯泡烧坏了。您应该去五金店买一个新的灯泡。 😉
好吧,认真...
3D渲染的透明度需要特别注意。通常,当SceneKit(或任何图形技术,实际上)渲染不透明的对象时,它将写入渲染目标中的两个输出:一个用于颜色,一个用于深度。 Having depth information during the rendering process表示不透明对象正确呈现在彼此的前面或后面,无论它们以什么顺序呈现,并可以进行一些性能优化。
例如,如果我绘制一个茶壶,然后在茶壶周围绘制一组茶杯,则GPU可以根据它们的相对深度,快速决定是保留茶壶中的彩色像素还是将其替换为茶壶中的彩色像素。 (如果深度测试表明它不需要其中的一些像素,则无需浪费时间渲染它们。
Depth tests work only for opaque objects, though. For semitransparent objects, you have to manage render order.如果要使一个对象的像素混合在另一个对象的像素上,则首先渲染不透明的物体和最远离相机的透明物体,最后渲染最靠近相机的透明物体。
SceneKit有一些管理渲染顺序的技巧,但是在您的情况下,还有一个额外的皱纹:您有一个半透明的表面,因此该表面的某些部分需要在其他部分的前面进行渲染,并且哪些部分取决于相对于方向的方向相机。诸如SceneKit之类的高级场景图框架通常并没有多大帮助,因为它们可以一次在网格中渲染所有三角形,因此您将被困在它们定义的任何顺序上,从而导致出现如左图所示的情况在下图中。
但是,iOS 11中的SceneKit(以及tvOS 11和macOS 10.13 High Sierra,也可能是watchOS 4)具有解决方案。看一下新的transparency modes:如果使用dualLayer
设置,SceneKit会自动将透明表面拆分为两个渲染 channel ,一个渲染 channel 的背面,另一个渲染 channel 的正面。这不仅可以确保网格中的三角形彼此正确融合,而且放置在对象内部的任何物体也可以正确融合。
这是很好的解释in the WWDC17 talk on SceneKit here(上面的图像来自哪里)。
对于灯泡,您可能还需要检查某些 Material 上的writesToDepthBuffer
属性。
关于ios - 从不同角度查看时,是什么导致SceneKit几何图形的各个部分在 "pop"中进出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46594458/