我在使用3D时相当新手,但我会尽力解释我的情况。
我正在将一些模型(来自Maya的DAE)导入到使用半透明材质的SceneKit(XCode 9)中。在这个特定情况下,我将参考一个灯泡模型。当直接观察模型时,通过外部玻璃可以看到内部的灯丝"层。 当我沿着x轴转动模型时,即使只是轻微,灯丝也会消失。
我注意到在其他几何中包含半透明材质的几何体中的这种行为。我也在使用基于物理的照明。有人遇到过这种情况么?提前谢谢。
答案 0 :(得分:7)
在第二张图片中,您的灯泡烧坏了。你应该去五金店买一个新的灯泡。
好的,认真的......
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会自动将透明曲面分成两个渲染过程,一个用于背面,另一个用于前面。这不仅可以确保网格中的三角形相互正确混合,而且放在对象内部的任何内容也会正确混合。
很好地解释了in the WWDC17 talk on SceneKit here(上图中的图片来自)。
对于灯泡,您可能还需要检查某些材料上的writesToDepthBuffer
属性。