我正在 three.js 中建造某种行星系统,我花了几个小时寻找一个合适的解决方案,在一个星球上获得外部发光 - 带纹理的球体对象。
我偶然发现了这个例子http://stemkoski.github.io/Three.js/Selective-Glow.html,但事实是 - 这种形式的发光也会影响主3D对象,导致颜色发生变化(如图所示)。
另一个不错的发光示例可以在这里http://bkcore.com/blog/3d/webgl-three-js-animated-selective-glow.html找到,但它再次发光整个区域,而不仅仅是“外部”的东西。
我一直在GitHub上阅读一些关于“overrideMaterial”属性的讨论主题,但这似乎是实验性的,未使用的和未记录的......甚至不确定这是否可以解决我的问题。
请分享您的想法,谢谢!
答案 0 :(得分:40)
我已经做了一些分离出产生大气效果的WebGL Globe代码(链接到上面)的部分。初步工作版本在这里:
http://stemkoski.github.io/Three.js/Atmosphere.html
据我所知,原始代码中有一些有趣的事情可以创建大气效果。首先,发光的纹理被放置在另一个球体上 - 让我们称之为Atmo球体:) - 围绕着球体,上面有地球的图像。大气材料被翻转,使得正面不会呈现,只有背面,因此即使围绕它,它也不会遮挡地球。其次,通过使用片段着色器而不是纹理来实现渐变照明效果。但是,如果放大和缩小,气氛会改变它的外观;这在WebGL Globe实验中并不明显,因为缩放被禁用。
[4月30日更新]
接下来,类似于
的源代码http://stemkoski.github.io/Three.js/Selective-Glow.html
将具有渐变照明纹理的球体(和另一个黑色纹理球体)放置在第二个场景中,然后使用添加剂混合器将该场景的结果与原始场景组合。只是这样您可以尝试使用用于创建发光效果的参数,我已经包含了几个滑块,以便您可以更改值并查看产生的不同发光效果。
我希望这有助于您入门。祝你好运!
[6月11日更新]
我有一个新的例子,它以一种更多更简单的方式实现了相同的效果,而不是使用后处理和加法混合两个场景,我只是更改了自定义材质中的一些参数。 (回想起来似乎很明显。)有关更新的示例,请查看:
http://stemkoski.github.io/Three.js/Shader-Halo.html
但仍然没有弄清楚平移/缩放问题。
[7月24日更新]
我想出了平移/缩放问题。它需要使用着色器;有关复杂性的详细信息,请参阅相关问题Three.js - shader code for halo effect, normals need transformation,有关最终工作示例,请参阅:
http://stemkoski.github.io/Three.js/Shader-Glow.html
我对最终结果非常满意,所以我不会再更新这个答案了:)
答案 1 :(得分:1)
在你所指的例子中,我使用了蓝色发光和添加剂混合 - 如果你使用白色代替,那么可能会产生你想要的效果。