iOS SceneKit 霓虹灯

Posted

技术标签:

【中文标题】iOS SceneKit 霓虹灯【英文标题】:iOS SceneKit Neon Glow 【发布时间】:2015-02-14 22:26:51 【问题描述】:

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

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

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

非常感谢。

【问题讨论】:

您是在谈论具有明亮的材质,即使没有光源,还是在谈论在明亮的物体周围渲染“光晕”? 两者都适合,但我正在寻找的效果可能是两者的结合。如果您想象与将灯安装在表面上的类似效果。当它打开时,它会将光线投射到它周围的其他物体上。 过去我使用 gimp 处理 2D 图像,增加了明亮元素的大小并进行了模糊处理。效果类似于this 【参考方案1】:

正如@DavidRönnqvist 在 cmets 中所暗示的,有多种方法可以使物体看起来发光。您可以一起或单独执行这些操作 - 您可能需要调整组合它们的方式以获得您想要的效果。

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

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

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

    如果您希望在光源周围有一个发光的光环,事情会变得有点困难。那是体积光照,这不是 SceneKit 开箱即用的功能。但是有几种方法可以伪造它:

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

【讨论】:

听起来是几个不错的选择。我会看看发射设置,看看我能做什么。我会在测试后标记为答案并发布我的最终结果。【参考方案2】:

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

Glowy 3D 是我的领域!

有几种方法可以在 SceneKit 中使对象发光。

最直接的方法是在 GLSL 中使用SCNTechnique 进行设置。您将需要多次通过来渲染照明,然后依次在 X 和 Y 上模糊它(比同时更快)。 GPU Gems 上有一篇很棒的文章。但是,如果您过度使用它,它会很重,而且我不太确定您是否只能针对 SCNTechnique 中的照明。

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

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

最后,对于您的发光效果,您可能需要研究一下神光。使用 GLSL 也很容易设置它们,所以 SCNTechnique 应该可以解决问题。这是关于它的article。

【讨论】:

嘿,我本来打算在我最初的答案中解决过滤器和技术,但是在写了这么多之后我开始忘记它......认为这是一个停止的好地方。 :) 顺便说一句,您确实可以将 SCNTechnique 渲染传递限制到特定节点 - 请参阅技术定义字典中的 includeCategoryMask/excludeCategoryMask 我说的是限制通道,而不是节点,因为发光应该只适用于发射通道,而不适用于颜色、反射等。但感谢您的提醒!

以上是关于iOS SceneKit 霓虹灯的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 小技巧之霓虹灯文本的「故障」效果的实现

霓虹都市(Neon City) 苹果版下载 | iOS版下载 | iPhone版本下载 | 游戏下载 | 手机游戏免费下载 | 安卓版免费下载 | Android版本免费下载 - 赛车游戏 赛车 竞速

如何制作漂亮的霓虹灯效果?

真·霓虹灯牌

如何在具有霓虹内在函数的多核处理器中有效地使用所有霓虹灯单元

简易霓虹灯控制器