iOS SceneKit Neon Glow

时间:2014-12-16 15:01:14

标签: ios swift effects lighting scenekit

一直在寻找Scenekit上的灯光,虽然我现在可以应用一个灯光节点来点亮我正在寻找一种从物体内发光的方法。

作为一个例子,想象一下霓虹灯发光,或者将灯光投射到其他物体上的灯泡。

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

非常感谢。

2 个答案:

答案 0 :(得分:15)

正如@DavidRönnqvist在评论中暗示的那样,有多种方法可以使对象看起来发光。你可以一起或单独完成这些 - 你可能需要调整你如何组合它们以获得你想要的效果。

  1. 对于发光的对象,您可能不希望场景中的其他光源出现阴影。使用材质的emission通道为对象提供覆盖其他光源阴影的颜色或纹理。 (如果使用纹理,较亮的部分看起来会发光,如前面文档中的示例所示。)

  2. 您可能希望场景中的其他元素被发光物体照亮。 emission材质属性可以防止对象因照明/阴影而变暗,但不会使其成为光源。要获得光源,您需要向包含对象的节点树添加至少一个SCNLight

    根据您的场景,您可能只能使用一个光源;例如如果物体是灯泡,你可以在它的中心放置一盏灯并完成它。 (好吧,您可能还需要使用节点和灯光的类别位掩码来确保光线通过灯泡发光,而不是被它遮挡。)如果您有一个大而复杂的霓虹灯,那么你可能需要创建多个光源 - 否则,标志附近物体上的照明将背叛它是单点光源。 (如果没有任何靠近标志点亮的东西,单点光可能就足够了。)

  3. 如果你想在光源周围有一个发光的光环,事情会变得更加困难。这是体积照明,而且它不是SceneKit可以为你开箱即用的东西。但有几种方法可以伪造它:

    • 对于像灯泡这样的点光源,具有发光纹理的2D广告牌可能就足够了。 (参见@ MatthewBaker的评论。)
    • 对于像霓虹灯这样的大灯,您可以尝试沿其长度放置几个广告牌。实现这种方法的好方法可能是SCNParticleSystem,因为它可以在几何体的表面上产生粒子。
    • 复杂形状灯光的另一个好选择可能是shader modifiers。 GLSL着色器可以通过根据视图和曲面法线向量之间的角度改变alpha来模拟体积光照。
    • 如果发光只需要出现在非常靠近光线的表面上 - 例如霓虹灯管后面的实心标志 - 您可以通过将发光烘焙成纹理并在所述表面上使用该纹理来伪造它。 (再次,emission救援。)
    • 将Core Image滤镜附加到包含灯光的节点(或其几何体的副本),以便您可以使渲染图像变亮,展开和模糊。
    • 使用techniques使用一些奇特的GLSL技巧进行多遍渲染以创建光环,如@ Moustach的回答中所述。

答案 1 :(得分:4)

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

Glowy 3D是我的域名!

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

最直接的方法是使用SCNTechnique在GLSL中进行设置。您将需要多次传递,以渲染照明,然后在连续的X和Y上模糊它(比一次更快)。在GPU Gems上有一篇很棒的文章。然而,如果你过度使用它,这个很重,我不太确定你是否只能在SCNTechnique中定位照明。

第二种方法是使用CI过滤器。只需添加高斯模糊并将其合成在顶部。您可能需要其他效果来选择/增强发光元素。如果您正在寻找对象周围的光晕this question也可能对您有帮助。

第三种方法是使用广告牌伪造发光。在photoshop或3D软件中制作模板,将其放在始终面向相机的平面上。将其混合模式更改为屏幕,您的发光非常便宜!

最后,为了你的光线照射效果,你可能想要研究一下。使用GLSL也很容易设置它们,所以SCNTechnique应该可以解决问题。这是关于它的article