1、NVIDIA在游戏中实现光线追踪百万光源欧阳耀斌NVIDIA开发者技术工程师,2020年12月#page#光追带来新光源突破光栅化在光照上的限制#page#什么样的限制?看一个例子现实世界包含了:大量有形光源(而非无限小或无限远光源所有光源都会带来复杂的阴影(可见性判断)#page#什么样的限制?看一个例子现实世界包含了:大量有形光源(而非无限小或无限远光源所有光源都会带来复杂的阴影(可见性判断)动态光照;开启/关闭,改变颜色#page#什么样的限制?看一个例子现实世界包含了:大量有形光源(而非无限小或无限远光源所有光源都会带来复杂的阴影(可见性判断动态光照;开启/关闭,改变颜色光源可具有任意
2、形状,带有任意纹理#page#什么样的限制?看一个例子现实世界包含了:大量有形光源(而非无限小或无限远光源所有光源都会带来复杂的阴影(可见性判断动态光照;开启/关闭,改变颜色光源可具有任意形状,带有任意纹理多个连通区域,各自具有不同的光光源#page#什么样的限制?看一个例子现实世界包含了:大量有形光源(而非无限小或无限远光源所有光源都会带来复杂的阴影(可见性判断)动态光照;开启/关闭,改变颜色光源可具有任意形状,带有任意纹理多个连通区域,各自具有不同的光源阴影不仅影响漫射,还会影响高光#page#什么样的限制?看一个例子现实世界包含了:大量有形光源(而非无限小或无限远光源所有光源都会带来复杂
3、的阴影(可见性判断)动态光照;开启/关闭,改变颜色光源可具有任意形状,带有任意纹理多个连通区域,各自具有不同的光源阴影不仅影响漫射,还会影响高光实时光追可以处理所有这些情况全动态#page#实时光照的现状光栅化:为一系列像素计算光照每光源一张阴影贴图(shadowmap)重要的光源通常会被预先标出#page#实时光照的现状光线追踪光栅化:每光线可独立计算光照为一系列像素计算光照每光线可独立查询光源的可见性每光源一张阴影贴图(shadowmap)重要的光源可在运行时动态决定重要的光源通常会被预先标出性能优化的方式:重用:三角形,模型,图像,屏幕分块,启动设法摊平开销:更多像素查询一张shadow
4、map#page#实时光照的现状光线追踪光栅化:每光线可独立计算光照为一系列像素计算光照每光线可独立查询光源的可见性每光源一张阴影贴图(shadowmap)重要的光源可在运行时动态决定重要的光源通常会被预先标出性能优化的方式:性能优化的方式:.应该怎样优化?重用:三角形,模型,图像,屏幕分块,启动设法摊平开销:更多像素查询一张shadowmap#page#高性能光线追踪为何光追会比光栅化更快#page#高性能光线追踪为何光追会比光栅化更快简单:独立的可见性查询按需使用;不多不少优化方向:如何尽量“少采样”“少用光线”#page#一个思想实验为何光追会比光栅化更快想象用光栅化绘制一张shadow
5、map#page#一个思想实验为何光追会比光栅化更快想象用光栅化绘制一张shadowmap分辨率从12到40962,开销是线性增加的吗?并不是。店#page#一个思想实验为何光追会比光栅化更快想象用光栅化绘制一张shadowmap分辨率从12到40962,开销是线性增加的吗?并不是。店12的开销并不是40962的1/40962也许是1/16.如果只有一个像素需要查询该光源的可见性,那将浪费许多计算#page#一个思想实验为何光追会比光栅化更快想象用光栅化绘制一张shadowmap分辨率从12到40962,开销是线性增加的吗?并不是。一旦我们要处理10,000个光源,不需要给每个光源配置4096
6、2辩率的shadowmap光源的可见性查询也不会在光源视角上均匀分布使用shadowmaps需要使用复杂的过采样以及过滤技术来避免瑕症#page#一个思想实验为何光追会比光栅化更快想象用光栅化方法处理大量光源的阴影需要分配大量的shadermap,每张光源一个大部分光源影响范围不大,每张shadowmap分辨率应该降低降低分辩率带来的提升不足以抵消shadowmap增多带来的开销生成每张shadowmap都需要单独的光栅化流程大幅增加drawcall#page#另一个考虑为何光追会比光栅化更快?优化的关键原则:让常见的情况更快#page#另一个考虑为何光追会比光栅化更快?优化的关键原则:让常见