接下来,我将介绍移动光线追踪的情况。现在最新的智能手机已经支持硬件加速的Ray Query(也称为Inline Ray Tracing)。Ray Query可以在任何着色器阶段使用,例如顶点着色器、像素着色器或计算着色器。然而,在移动设备上调试光线追踪依旧具有挑战性,因为大多数截帧工具和GPU性能分析工具都不支持移动端的Vulkan Ray Query。
使用Ray Query实现反射面临几个挑战。第一个挑战是如何对反射像素进行着色。在Vulkan Ray Query中,没有RTPSO。而且我们的游戏中没有Bindless Texture。但是场景中有成千上万种不同的材质。不可能使用一个通用着色器来对其进行着色;第二个挑战是当前的渲染流程是正向渲染,我们需要为反射创建一个混合渲染管线;第三个挑战是性能。例如,耗电和帧率。
这是《暗区突围》手游的Ray Query反射渲染管线。第一个渲染Pass是Base Pass,它会获取所需的像素信息。第二个Pass是Query Scene Pass,我们发射光线以获取屏幕空间中每个像素的网格和三角形信息。第三个Pass是可见性解析Pass,该Pass将为每个像素计算反射颜色。接下来的两次渲染使用联合双边滤波来获取光泽反射纹理。最后,将光泽反射纹理与场景颜色混合。稍后我将介绍关键步骤。
然后,我将介绍渲染流程中的关键渲染步骤。在Base Pass中,我们将渲染一个额外的Render Target。它存储了法线、粗糙度和一个标志位。我们称之为Thin G Buffer。中间的图像是Thin G Buffer。
下一个是Query Scene Pass。由于光线查询中没有光线追踪管线状态对象(RTPSO),所以我们使用Query Scene Pass和Visibility Resolve Pass代替。在Query Scene Pass中,我们重构世界位置和反射光线方向。然后发射一条光线,如果击中任何实例,则存储实例ID、三角形ID和击中点的重心坐标。左侧的图像存储了打包的三角形ID和重心坐标。右侧的图像存储了模型绘制ID。