在星际争霸2中使用“Render To Texture”实现透镜效果

下面和大家探讨一下实现的方法:
渲染到纹理RTT(Render to texture)指的是将游戏画面以纹理的方式渲染,我们知道在3D游戏中纹理可以作为模型的贴图来表现,使用RTT手法就可以在模型表面显示出一部分游戏画面。这种方法很适合做摄像头和瞄准镜监控的效果:
Halo中的狙击镜即使在不使用的时候也有使用RTT来达到显示效果



人类设计出摄像头和瞄准镜,其实是对眼睛这一器官的模拟和仿制,我们知道自然界具有高级视觉功能的光学眼睛一共有两大类,脊椎动物使用的倒装式和软体动物头足纲使用的正装式。


那么我们该如果搭建我们自己的透镜系统呢?我们也根据类似的思路,做了这样两种:
脊椎动物式:




章鱼式



二者的区别主要在于感光元件——也就是能够识别光学信号的组件——摄影机的位置,在乌贼和章鱼等头足纲动物眼睛中,它是前置的,而在人类等脊椎动物眼睛中,它是后置的。
在实际测试中,我们发现章鱼式的RTT搭建容易在极近景时出现畸变和鱼眼效果,这是由于摄影机距离物体最小距离过短。所以这种眼睛适合做瞄准镜、望远镜等从远距离观察目标的系统。(如最终效果中的图2)
与之相反,脊椎动物式的RTT搭建由于在一开始就拉远了摄影机,所以不会出现这种畸变,但是它会将我们的显示器效果也拍摄进画面中,这就导致类似多重镜子式的无限循环,因此我们也仿照生物的做法,使用近点剪切来将显示器排除到拍摄画面以外。这样搭建的RTT适合做上帝视角下观察用的放大镜 (如最终效果中的图1)

搭建完我们的摄影机和显示器后,我们要将二者用RTT连接起来。在星际争霸2中,暴雪使用相应事件来控制此类效果,但是需要声明纹理槽位,摄影机名称,RTT通道等一系列信息,而这些预设信息都保存在3D模型中,这些信息使用银河引擎的人无法直接获取,而只能由模型作者提前声明。
这就导致额外的沟通成本,所以熟练的模型作者通常会自行使用等价的“模型内事件 ”来自我声明,这样银河引擎作者就不用再引擎内额外设置了,如下图所示:


完成设置后,摄影机就和显示器实现了画面连接,我们的摄影机所观察到的画面就会原样显示在显示器上了,仔细调整显示器的尺寸,就能做出放大缩小等透镜效果了。
在工作中因为项目需要做了一些关于RTT的研究,发帖分享给大家,抛砖引玉,希望大家喜欢,GG,GL。


本文来自网易实践者社区,经作者李阳授权发布。