游戏中实现反射的几种方式
1.拷贝相机:利用额外的相机将反射的内容渲染到Render Target Texture上
参考:《Unity Shader入门精要》10.2.1节
原理很简单,以反射面(例如镜子)为中心,创建一个相机,处于主相机在镜子中反射的位置,用脚本实时更改相机位置与朝向
这个相机渲染的内容不直接输出到屏幕,而是输出到一张RTT上
然后再将这张RTT的左右翻转(例如直接缩放-1),再贴到这个平面上,就可以实现镜子效果了.

2.拷贝场景 (应该没人会这么做)
直接将当前场景拷贝一份,主角也拷贝一份,然后左右翻转
适合于小场景空间的镜面反射,效果简单粗暴又好
3.屏幕空间反射(SSR)
参考:Unity URP 屏幕空间反射Screen space Reflection(SSR) - 知乎 (zhihu.com)
Screen Space Reflection | 3D Game Shaders For Beginners (lettier.github.io)
在Unity中实现屏幕空间反射Screen Space Reflection(1) - yangrc1234 - 博客园 (cnblogs.com)
缺点:由于是通过屏幕上的内容虚拟出来的反射内容,所以当镜头往下看时,场景里的部分内容消失在屏幕外时,会发现水中的倒影也随着消失。
可以与下面的反射探针组合,避免玩家朝下看时水中什么倒影都没,可以固定反射天空,远处的高楼等。
3.光追(效果最好,最吃性能)
暂无参考
4.Cube反射贴图

传统上,游戏使用一种称为_反射贴图_的技术来模拟来自对象的反射,同时将处理开销保持在可接受的水平。此技术假定场景中的所有反射对象都可以“看到”(因此会反射)完全相同的周围环境。
Cube贴图可以由美术制作,也可以在运行时从6分方向截图获取。
缺点:如果游戏的主角(比如闪亮的汽车)处于开放空间中,此技术将非常有效,但是当角色进入不同的周围环境时,便看起来不真实;如果一辆汽车驶入隧道但天空仍然在窗户上产生明显反射,看起来就很奇怪。
5.反射探针 - Unity(反射贴图的改进)
传统的反射贴图仅使用单个立方体贴图来表示整个场景的周围环境。立方体贴图可由美术师绘制,也可通过从场景中的一个点进行六次“快照”(每个立方体面对应一次快照)获得。
简单高效,但在部分场景会失真,例如上面提到的隧道里还能反射出天空,以及随着时间变化的天空。
反射探针在这方面进行了改进,允许您在场景中设置许多预定义的点,在这些位置点可创建立方体贴图快照。因此,您可以在场景中存在明显不同反射的任何位置点记录周围视图。
例如《赛博朋克2077》,《最后生还者2》等游戏就使用该种方式与SSR组合,场景里近处的物体通过SSR反射,远处的高楼,天空,通过反射探针,可以以比较少的性能实现比较好的效果。
当角色低下头看地面时,即使远处的高楼跟天空消失在屏幕上,SSR无法正常反射其内容,但仍然能通过预生成的反射探针来反射其内容。
Unity里的反射探针有几种方式:Baked(预烘培固定内容)、Custom(预烘培固定内容+实时反射部分动态物体) 和 Realtime(实时反射全部内容)
而UE4的反射探针(球形/盒子反射捕获)是不支持实时捕获的,只能预烘焙。
6.虚幻引擎中的平面反射
Unreal Engine 支持实时平面反射,它比屏幕空间反射(SSR)更加精确,但渲染开销较高。渲染开销较高的原因来自平面反射的工作原理。因为平面反射实际上将从反射方向再次对关卡进行渲染。

UE4的反射处理:
Cube天空盒:实时,天空颜色变了也能实时反馈出来,可以实现简单昼夜循环
反射探针:静态物体,需预烘培,即使场景的光源全部关闭,它也会亮着,要实现昼夜循环,需要记录多个时间段的探针,然后实时插值,根据不同时间段切换不同的探针(燕云十六声的技术)
SSR:实时,效果差


浙公网安备 33010602011771号