图形光栅化综合实现分析

发布时间 2023-11-28 04:22:17作者: 吴建明wujianming

图形光栅化综合实现分析

当前阶段,光栅化仍然比光线追踪“快”,而光线追踪可以比光栅化更好地处理某些效果,如反射、软阴影、全局照明等。目前通常采用混合射线追踪,例如仅反射使用光线追踪而光栅化其他所有内容(包括主光线)。主流的GPU已基本支持光栅化、计算、光线追踪甚至深度学习等管线混合计算:

 

确定游戏开发人员在集成到现有游戏引擎基础设施时必须解决的问题,因为游戏引擎是为GPU设计和优化的,包含艺术资源和材质着色器。

传统的渲染管线如下图上所示,其中蓝色部分和间接光无关,可以忽略。下图下的红色是和间接光相关的阶段。

 

对于下图的黄色步骤,解决方案是多次反弹或近似。接下来要看的是透明度,它似乎是光线追踪的一个很好的候选者,对吗?

 

事实证明,屏幕空间照明问题同样适用于透明材质(多维性、性能、过滤)。当前已经在探索SSS的体积解决方案,但没有正确的SSS体积解决方案。混合渲染管线的流程如下:

 

对于非直接光照,分裂和近似Karis 2013有助于减少方差,蓝色是预先计算的,使用光栅化或光线追踪进行评估。

 

在RTX的渲染流程如下:

 

随机化的区域光渲染流程如下:

 

Battlefield V的光线追踪包含了GPU光线追踪管线、DXR的引擎集成、GPU性能等。

 

简单光线追踪管线:

 

生成管线阶段,读取GBuffer的纹理,使用随机光栅化来生成光线:

 

float4 light(MaterialData surfaceInfo , float3 rayDir)

{

    foreach (light : pointLights)

        radiance += calcPoint(surfaceInfo, rayDir, light);

    foreach (light : spotLights)

        radiance += calcSpot(surfaceInfo, rayDir, light);

    foreach (light : reflectionVolumes)

        radiance += calcReflVol(surfaceInfo, rayDir, light);

    (...)

}

然而这种简单的光追管线渲染出来的画质存在噪点、低效、光线贡献较少等问题:

 

可以改进管线,在生成射线时加入可变速率追踪:

 

可变速率追踪的过程如下:

 

可变速率追踪使得水上、掠射角有更多光线。但依然存在问题:

 

可以加入Ray Binning(光线箱化),将屏幕偏移和角度作为bin的索引。