一直在研究Scenekit上的照明,现在我可以应用照明节点来照明某些物体,而我正在寻找一种从对象内部照明的方法。

例如,想象一下霓虹灯或将光投射到其他物体上的灯泡。

任何想法如何实现这一目标?

非常感谢。

最佳答案

正如@DavidRönnqvist在注释中提示的那样,有多种方法可以使对象看起来发光。您可以一起或单独执行这些操作-您可能需要调整如何将它们组合在一起以获得所需的效果。

  • 对于发光的对象,您可能不希望场景中其他光源的阴影。使用材质的 emission 通道为对象赋予颜色或纹理,使其可以覆盖其他光源的阴影。 (如果使用纹理,则较亮的部分将看起来发光,如前述文档中的示例所示。)
  • 您可能希望场景中的其他元素被发光的对象照亮。 emission材质属性只是防止对象因照明/阴影而变暗,而不会使其成为光源。要获取光源,您需要至少在包含对象的节点树中添加一个SCNLight

    根据您的场景,您可能只需要一个光源就可以逃脱。例如如果对象是灯泡,则可以将灯放在其中心并进行处理。 (那么,您可能还需要使用节点的类别位掩码和灯光,以确保灯光通过灯泡发出而不是被灯泡遮挡。)如果您有一个大型而复杂的霓虹灯,可能需要创建多个光源-否则,标牌附近物体上的照明将出示它是单点光源。 (如果附近没有任何东西被它点亮,那么单点灯可能就足够了。)
  • 如果您希望光源周围有发光的光晕,事情会变得有些困难。那是体积照明,这不是SceneKit可以为您提供的开箱即用的功能。但是您可以通过以下几种方法来伪造它:
  • 对于类似灯泡的点光源,带有发光纹理的2D广告牌可能就足够了。 (请参阅@MatthewBaker的评论。)
  • 对于较大的灯(如霓虹灯),您可以尝试沿其长度放置几个广告牌。一个很好的实现方法可能是SCNParticleSystem,因为它可以在整个几何曲面上生成粒子。
  • 对于形状复杂的灯光,另一个好的选择可能是shader modifiers。 GLSL着色器可以通过基于视图和曲面法向矢量之间的角度来更改alpha来模拟体积照明。
  • 如果发光仅需要出现在非常靠近光线的表面上,例如霓虹灯管后面的实心标志-您可以通过将辉光烘烤成纹理并在上述表面上使用该纹理来伪造它。 (再次,使用emission进行救援。)
  • 将“核心图像”滤镜附加到包含光源(或其几何图形的副本)的节点上,以便可以增亮,扩展和模糊渲染的图像。
  • 使用techniques进行多遍渲染,并使用一些精美的GLSL技巧创建光晕,如@Moustach的答案中所述。
  • 关于ios - iOS SceneKit NEON 发光,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35723946/

    10-12 02:32