iOS SceneKit霓虹灯效果

9

我一直在研究Scenekit中的灯光,虽然现在我可以应用灯光节点来照亮某些东西,但我正在寻找一种从对象内部照明的方法。

例如,想象一下霓虹灯发光或者灯泡照亮其他物体。

有什么好的想法吗?

非常感谢。


你是在说要有一种即使没有光源也能发出亮光的材质,还是在说要渲染一个围绕着明亮物体的“光晕”? - David Rönnqvist
任何一种都可以,但我想要的效果可能是两者的结合。如果你想象一下类似于在表面上安装灯光的效果。当它被打开时,它会照亮周围的其他物体。 - Matthew Baker
过去我使用GIMP处理2D图像,将亮元素的大小增加并进行模糊处理。效果类似于这个链接 - Matthew Baker
2个回答

17

正如@DavidRönnqvist在评论中暗示的那样,让一个对象看起来发光有多种方法。您可以分别或同时使用这些方法 - 您可能需要调整它们的组合方式以获得所需的效果。

  1. 对于发出光线的对象,您可能不希望场景中的其他光源产生遮挡效果。使用材质的emission通道,为对象添加颜色或纹理,以覆盖其他光源的遮挡效果。(如果使用纹理,则亮度较高的部分将会发出发光,就像在前面链接文档中展示的那样)。

  2. 您可能希望场景中的其他元素也受到发光物体的照明。 emission材料属性只能使对象免受光照/遮挡的影响,而不能成为光源。要创建光源,您需要向包含对象的节点树添加至少一个SCNLight

    根据您的场景,您可能只需要一个光源;例如,如果对象是灯泡,则可以将光源放置在其中心并完成它。(好吧,您可能还需要调整节点和光的类别位掩码,以确保光线穿过灯泡而不是被遮挡。)如果您有一个大型复杂的霓虹灯牌,您可能需要创建多个光源,否则,附近物体的照明将揭示它是单点光源。(如果没有任何物体靠近标志进行照明,则单点光源可能已经足够了。)

  3. 如果您想要在光源周围产生发光光晕,就比较难了。那是体积照明,SceneKit无法直接为您完成。但是有几种方法可以伪造出来:

    • 对于像灯泡一样的点光源,可以使用带有发光纹理的2D广告牌。
    • 对于像霓虹灯一样较大的灯光,可以尝试沿其长度放置几个广告牌。一个好的实现方式可能是使用SCNParticleSystem,因为它可以在几何体表面上生成粒子。
    • 对于具有复杂形状的灯光,另一个好的选择可能是着色器修改器。GLSL着色器可以通过根据视图和表面法线向量之间的角度变化alpha值来模拟体积照明。
    • 如果发光只需要出现在非常靠近光源的表面上——例如紧贴在霓虹灯管后面的实心标志——则可以通过将发光烘焙到纹理中并在该表面上使用该纹理来伪造它。(再次利用emission)。
    • 将Core Image滤镜附加到包含光源的节点(或其几何形状的副本)上,以便可以使渲染的图像变亮、扩展和模糊。
    • 使用技术进行多通道渲染,并使用一些花哨的GLSL技巧来创建光晕,如@Moustach的回答中所提到的。

听起来有几个不错的选择。我会查看发射设置,看看我能做些什么。一旦我测试过并发布了最终结果,我会将其标记为答案。 - Matthew Baker

5

编辑:哎呀,我可能误解了问题... Rickster的回答更适合你的需求。

华丽的3D是我的专长!

有几种方法可以使一个物体在SceneKit中发光。

最直接的方法是使用GLSL在SCNTechnique中进行设置。您需要多次通过渲染照明然后连续X和Y模糊它(比同时处理更快)。关于这方面的内容,有一篇非常棒的文章可供参考 GPU Gems。但是如果过度使用此方法会很重,而且我不确定您是否只能在SCNTechnique中定位照明。

第二种方法是使用CI滤镜。只需添加高斯模糊并将其组合在顶部即可。您可能需要其他效果来选择/增强发光元素。如果您正在寻找围绕对象发光的方式,则这个问题也可能对您有所帮助。

第三种方法是使用广告牌来伪造发光效果。在Photoshop或您的3D软件中制作一个模板,将其放置在始终朝向相机的平面上。将它的混合模式更改为Screen,您就能够获得非常廉价的发光效果!

最后,对于您想要实现的光线照射效果,您可能需要查看神光(Godrays)。它们也很容易使用GLSL设置,因此SCNTechnique应该能够胜任。这里有一篇关于此的文章


嘿,我本来想在我的初始回答中讨论过滤器和技术的,但是在写了这么多之后,我开始失去了重点...所以觉得那是一个好地方停下来。 :) - rickster
1
顺便提一下,您确实可以将SCNTechnique渲染通道限制为特定节点 - 请参见技术定义字典中的includeCategoryMask/excludeCategoryMask - rickster
1
我说的是限制在通道上,而不是节点,因为发光只应用于发射通道,而不是颜色、反射等。但感谢您的提示! - Moustach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接