iOS的SceneKit霓虹灯发光

一直在看Scenekit的照明,而我现在可以应用一个照明节点来点亮一些东西,我正在寻找一种方法来从一个对象内部点亮。

举一个例子,想像一下霓虹灯,或者一个灯泡,将光线投射到其他物体上。

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

非常感谢。

正如@DavidRönnqvist在评论中暗示的,有多种方式可以使对象看起来发光。 你可以一起或单独做这些 – 你可能需要调整你如何结合他们来获得你想要的效果。

  1. 对于发光的物体,您可能不想从场景中的其他光源着色。 使用您的材料的emission通道,使物体具有覆盖其他光源阴影的颜色或纹理。 (如果您使用纹理,那么较亮的部分会显得发光,如上述文档中的示例所示。)

  2. 您可能希望场景中的其他元素被发光物体点亮。 emission材料的特性只是防止被照明/阴影使物体变暗,不能使其成为光源。 要获得光源,您需要将至less一个SCNLight添加到包含您的对象的节点树中。

    根据你的场景,你可能只能用一个光源逃脱; 例如,如果物体是一个灯泡,你可以在它的中心放一盏灯,并用它来完成。 (好吧,你也可能需要使用节点和灯光的类别位掩模,以确保灯光通过灯泡发出光线,而不是被遮挡。)如果你有一个大而复杂的霓虹灯,你可能需要创build多个光源 – 否则,标志附近的物体上的照明将会泄露它是单点光源。 (如果没有任何东西靠近正在点亮的标志,单点指示灯可能就足够了。)

  3. 如果你希望在光源周围发光,事情会变得更加困难。 这是体积照明,并不是SceneKit开箱即可为您做的。 但是有几种方法可以伪造它:

    • 对于像灯泡这样的点光源而言,具有辉光质地的2D广告牌就足够了。 (请参阅@ MatthewBaker的评论。)
    • 对于像霓虹灯那样的较大的光线,您可以尝试在其长度上放置几个广告牌。 实现这一点的一个好方法可能是使用SCNParticleSystem ,因为它可以在几何体表面产生粒子。
    • 对于形状复杂的灯光来说,另一个好的select是着色器修改器 。 GLSL着色器可以通过根据视图和表面法向量之间的angular度改变alpha来模拟体积光照。
    • 如果发光只需要在非常接近光线的表面上出现,例如霓虹灯pipe后面的固体标志,则可以通过将发光体烘焙成纹理并在表面上使用该纹理来伪造。 (再次, emission救援。)
    • 将核心图像filter附加到包含灯光的节点(或其几何体的副本),以便可以使渲染的图像变亮,展开和模糊。
    • 用Moustach的回答中提到的技巧,用一些奇特的GLSL技巧来做多次渲染来创build光环。

编辑:woops,我可能误会了这个问题… Rickster的答案更适应您的需求。

Glowy 3D是我的领域!

有几种方法可以使Scenekit中的对象发光。

最直接的方法是使用SCNTechnique在GLSL中进行SCNTechnique 。 您将需要多次通过渲染照明,然后连续模糊X和Y(同时快于两者)。 在GPU Gems上有一篇很棒的文章。 但是,如果过度使用这个,那么这个过程会非常繁重,而且我不太确定是否只能在SCNTechnique这个照明。

第二种方法是使用CIfilter。 只需添加一个高斯模糊,并将其复合在上面。 您可能需要额外的效果来select/增强发光元素。 如果你正在寻找物体周围的光芒, 这个问题可能也会帮助你。

第三种方法是用广告牌来伪造辉光。 在photoshop或3D软件中制作模板,并将其放置在始终面向相机的飞机上。 改变其混合模式为屏幕,你有一个非常廉价的光芒!

最后,为了你的光芒,你可能想看看上帝。 他们使用GLSL也很容易,所以SCNTechnique应该做的。 这是一篇关于它的文章 。