autorenew

🎉空间计算 + 人工智能 + iOS = ♾️, Let's visionOS 25 即将到来! 了解更多 →

神奇!RealityKit 中用不透明物体,反而更像玻璃?

说明

在 3D 渲染引擎中,半透明物体渲染一直都是个问题,之前的《用渲染排序解决 RealityKit 中的透明物体嵌套问题〈上篇下篇〉》中我们已经讲过,没有完美的解决方案。而半透明物体中,最常见的就是玻璃物体,本文我们再来聊聊 RealityKit 中玻璃物体的两种近似模拟。

用透明物体模拟玻璃

最容易想到的就是用透明物体来模拟玻璃,毕竟现实中玻璃它就是半透明的。除了调整不透明度 Opacity 外,还可以调整金属度和粗糙度,顺便再加一个额外的的菲涅尔效果(下图红框中)以增强边缘反光。

金属度:金属反射过低会导致玻璃丢失所有的反射,而过高的反射会让玻璃看上去很暗,现实中玻璃的金属度比较低。

不透明度:不透明度过高会让玻璃太实,失去通透感;太低会让玻璃过于透明,丢失反射。

但是这样出来的玻璃物体会很假,不知道大家发现没有?它不像一个实心的玻璃球,而像一个空心的泡泡,这是因为它没有折射效果,直接透过了背景的颜色。

用 Environment Radiance 模拟玻璃折射效果

为了更好的模拟玻璃,我们需要对背景进行折射,然而 RealityKit 的渲染仍然是传统的光栅化,而不是完全的光线追踪,想要进行精准的折射是不可能的。但是我们可以用 Environment Radiance 来模拟这种效果。

Environment Radiance 原本是用来处理反射效果的,反射周围的环境贴图信息(Skybox 和 IBL),就像下面的反射球一样:

但是,我们可以通过控制反射的法线,来实现类似于折射的效果,看起来就像透过了后面的物体一样:

如下图,左侧是它的正常工作方式,反射 眼睛 后方的环境贴图(Skybox)。右侧是我们想要的结果,只需要计算出合适的法线就能让球体显示出 眼睛 前方的环境,再添加点扰动,就形成了类似折射的效果:

要得到这样的一条法线,有多种方法,我最先想到的就是 叉乘(Cross Product),而苹果在官方 Demo Implementing adjustable material 中提供了很好的近似拟合方法:利用折射函数进行计算。

它的计算过程如下,利用折射函数得到折射后的向量(Refract),再与 -ViewDirection 相加,就得到了个近似的新法线(New Normal),然后用它得到的环境信息。

缺点

但是,请注意它的原理和拉斯维加斯的球形显示巨幕是一样的,把后面的环境信息显示在物体上,并不是真的透视和折射。所以不能真正显示出背后的其他物体,只能显示环境贴图(Skybox)并根据你的观看角度进行变化,给你一种透明的错觉

比如,我们旋转角度就会发现:透过球体看不到后面的龙,透过龙也看不到球体,它们只能显示后面的环境。

而且它的折射也是不真实的,只是看起来像透明且有折射而已,和现实世界并不一致,现实的玻璃球不仅扭曲还有倒置效果,不过考虑到其他形状一般不会有倒置效果,这里的效果已经够用了。

根据需要选择

在渲染引擎完全采用光线追踪方式进行渲染之前,透明物体和玻璃物体的渲染永远都是个难题,没有完美的方案。我们只能使用各种技巧,来实现一些近似模拟的效果。

参考资料

本文作者

苹果API搬运工