光圈科技传送门特效UE4实现(超详细攻略)

效果:
原理可以看这个视频:
50Cal是用opengl和开源物理引擎手撸的,这工作俩量想想都觉得头皮发麻。俺这里是用ue4实现的,不支持传送门递归,也没有用模板遮罩进行性能优化。
50Cal把原理讲的很清楚了,这篇文章俺着重讲一下在ue4中实现的细节,和一些坑点。
平面反射详解
传送门透射本质上是在平面反射的基础上整的花活儿,要整平面反射,就得在和主视角摄像机镜像的位置创建一个场景捕获actor(那玩意全名叫做场景捕获2D)。

那么,怎么才能获得主视角的镜像位置呢,我们需要一些简单的几何学。

已知镜面上一点P和镜面的法向量n,求A关于镜面的对称点B,也就是要算出向量AB,由反射的性质可得,AB垂直于镜面,且AC=BC=点A到平面的距离,点A到平面的距离=dot(PA,n)。
所以完整的式子:OB=OA+AB=OA-2dot(PA,n)*n。加粗的代表向量。dot表示点乘。
好了,算出了位置之后我们还得算出朝向。

a是主视角朝向,b是镜像之后的朝向,b的方向其实相当于a向量被镜面反射后的方向,
b = a-2dot(a,n)*n,这个公式的推导和上面差不多,读者可自行画图推导。
好了,我们可以将主摄像机的x和z轴进行镜像,然后通过镜像之后的x轴和z轴构建旋转。在这个过程中,你可能需要用到这些蓝图函数:

好了,到了这一步,你已经将场景捕获放到了正确的位置,接下来,你需要裁剪视锥体。注意图1视锥的虚线部分,如果虚线部分有几何体的话,它会出现在场景捕获的结果中,这是我们不希望看到的。要裁剪掉这个,我们需要使用屏幕捕获的裁剪平面功能,这个功能很不好找。你需要点开场景捕获展卷栏下面的三角形。

你可能会看到启用剪切平面的按钮是灰色的,它需要在项目设置中打开全局剪切平面才能使用。
剪切平面基础:剪切面上任意一点(世界空间),对于我们来说,就是镜面的位置。
剪切平面法线:剪切平面的法线,对于我们来说就是镜面的朝向。

你可能需要用到这些蓝图函数:

现在,你只需要设置一个render target就可以从场景捕获中得到反射画面了。你可以在内容浏览器中点击右键创建渲染目标,它在材质和纹理子菜单下。

注意,视场的设置应该和主相机保持一致,纹理目标的长宽比要和玩家视口的长宽比保持一致(出于性能考虑,尺寸可以小一点,比如你的主视口是1080p的,那你的纹理目标可以用一个800x450的,保持比例即可)。
将场景捕获渲染到贴花
传送门可以是墙上的一个平面,也可以是一个贴花,但显然贴花更加便利,用平面的话你需要让平面在墙的前面一点点,不能在墙壁里,这样就看不见了,也不能离墙壁太远,这会被看出破绽,你需要非常小心的为墙壁设置碰撞体积,来保证碰撞发生的位置正正好。用贴花就没有那么多麻烦。
第一步,我们的贴花要完全消去物体本身的光照。打开材质编辑器,然后这样设置。


将这个材质应用于贴花,贴上的物体将会变成100%的黑色,接着,我们将场景捕获的渲染目标连接到自发光,那么最终颜色将完全由自发光分量构成。
采样渲染目标时,uv应使用屏幕空间坐标,并将u反向。如图所示


现在,你做出了一面完美反射的镜子!如果你不知道为什么uv要用屏幕空间坐标,那么请返回图1仔细琢磨。
关于HDR,sRGB,色调曲线
确保场景捕获的这项设置,设置为RGB场景颜色(HDR)

RGB(HDR)反应的是物理上,红绿蓝三个分量的辐射强度,它的值可以大于1,上不封顶。这和应该在材质中输出的内容是匹配的。ue计算完画面的HDR颜色之后,会经过Color correction,变换到线性sRGB色彩空间(线性sRGB空间指没有进行gamma矫正的sRGB空间),最后经过色调映射(Tone Mapping)变换到0~1之间的值。
总结:如果要把场景捕获的结果画到材质上,那么始终应该使用RGB(HDR),如果要在UI上或者后期处理中使用场景捕获的结果,那么应该使用sRGB(带色调映射)。
现在你对场景捕获已经有了深入的了解!再回头看看UE的文档你会发现他真是写了个寂寞。
https://docs.unrealengine.com/4.27/zh-CN/Resources/ContentExamples/Reflections/1_7/
从平面反射到传送门透射
前文说了,传送门透射只是在平面反射的基础上整了个花活儿。

玩家主视角相机在A,为了正确渲染传送门P1,我们需要在A''处放置场景捕获。A'是A的镜像位置。聪明的你已经注意到,A'相对与P1的位置就是A''相对于P2的位置。
所以,完整的做法是,镜像A,得到A',取得A'相对于P1的变换T1,取得P2的变换T2,然后叠加T1,T2。
这个变化的过程用蓝图表示是这样的:

在本例中,transform对应A',from对应P1,to对应A2,乘号对应的函数叫做“compose transform”。
接下来你还需要做个传送门的外框,和一个未开启的传送门材质,不过这个不是这次讨论的重点了,我写累了,如果有需要的我以后会再写一篇讲讲这个材质。
不知道怎么做的也可以去看看ue官方的材质系列教程。或许学完了可以比我做得还好看
https://www.unrealengine.com/zh-CN/onlinelearning-courses/materials-master-learning?lang=zh-CN
