• 全局光照技术解析Global Illumination Explained


    解析全局光照Global Illumination Explained

    前言:Global Illumination全局光照技术是实时渲染的必然发展方向。我参考了一些研究成果,琢磨了一下,让更多的人可以理解这项“古老”的技术。

    Front Line

    虽然说,如今的GPU速度已经非常之快,并行浮点计算能力已经相当的强大,但是由于很多人依旧使用传统的Phong局部光照模型对场景进行Shading处理,所以成像效果上还远远不能够与离线渲染的图像相比。如让我们目瞪口呆的Unreal Engine3,技术规格依旧是48bit Color Phong HDR。虽然人们已经开始普遍的使用Shading Language,但是光栅化、对屏幕空间差值的操作依旧没有变化。这一点不同于Pixar RenderMan。重要的原因就是,无法精确的从物理上模拟光线在场景中的交互过程。对于PC机平台来说,由于硬件性能的限制,实时光线跟踪还是不现实的事情,但是我相信未来人们一定可以在PC机平台上置身于可以和电影画面媲美的场景中交互、游戏。

    经典全局光照模型的公式如下:

     

           场景的每一个物体,既有可能是发光体(萤火虫、火把),也有可能是接受光线的物体(举火把的人)。意义等同于,物体的每个点都可能会互相影响。让我们想象,有一个模型S由许多个三角形组成,以每个顶点Vertex为中心,以这点的向量Normal为法向量,构造一个半径为1的半球体Normalized Hemisphere。这样的做法类似于Ambient Occlusion的步骤。当我们从y发出一条光线以ωi的方向入射的时候,函数h返回光线与模型的第一个交点。这里可以进行并行优化。θi是指ωiNormal的夹角,cosθi将射入的辐射光线投影到Normalized Hemisphere上。模型上每一个点y的辐射度L等于,这个点本身的辐射度Le与反射的辐射度之。可以使用在半球上取一些点采样,进行测试,或者使用更精确不过更加耗时的Monte Carlo采样法。我们也可以简单的把上面的积分式写成这样的简单式子:

     

           frBRDF函数,表现了模型表面的颜色光泽等特性。一般来说这个函数的计算依赖于辐射的入射方向ωi,辐射的反射方向ωr,以及y。为了简化BRDF的表达,我们将公式简化如下,这样表面将只存在各向同性漫反射:

          

           pd(y)是相应位置的漫反射贴图数值。我个人觉得大家如果不知道如何实现BRDF,可以参考GPU Gems1上的那篇《Spatial BRDFs》一文。

            现在我们有了4个量,(S, fr, Le,Ψ),最后一个是什么呢?这是处理微平面反射向量集合的函数,可以从理论上分析得到。此时,再试图分解这个公式已经没有多少意义,不如直接用一个近似模型简化:

     

           我们直接使用这个公式得到,穿过像素Pmn光的平均辐射度值 —— 我们知道“摄象机”上有一个个像素,把yf想象为一个针孔,ωyf := P – yf作为方向,XPmn是像素特征函数,δ是Kronecker Delta函数。(是什么东西……)

            Alexander Keller在他的《Instant Radiosity》中展现了一种算法,目的是为了快速计算光照特性实现实时渲染。想象场景由有限多的虚拟光源组成。对于像素Pmn,我们计算通过这个像素的平均辐射度:

     

           最后一项TmnL决定了最少有一条辐射光线通过像素Pmn。当场景中有M光源的时候,我们可以简单的进行累加:

     

           对于最右边的求和式,

      Li
    是辐射度,Pi是第i光源的位置。Tmn的数值可以用普通图形卡计算得到,直接计算当场景中只有一个光源存在时每个像素的亮度数值。这个算法的最大好处就是在性能和质量上可以寻求平衡,通过控制采样点数和光源数目,也就是控制多通道渲染的次数。

     

    Behind the Enemy

           Monte Carlo方法的大名想必大家都听说过。它需要一个随机数发生器,而且这个发生器对统计结果得质量来说非常重要。这里省略了详细的推导过程,大家可以看原文[1]

     

           首先想象从光源发出N粒子,从光源开始,赋予初始的辐射强度Le,射向场景,p-bar||Tfd||约等于场景的平均反射率。这些虚拟的光子不断地反射折射,不断地点亮,直到自己强度为0。伪代码如下:

     

           其中,入射方向可以使用下列公式计算得出:

     

           这种方法的思路被用于目前大部分的Monte Carlo光线跟踪渲染引擎中,比如赫赫有名的Mental Ray,而且可以同时使用GPUCPU进行加速渲染,缺点是多次累计填充率极高。

    Continue Fighting

           可以看我的那篇斯图加特大学光线投射引擎的分析文章。

     Conclusion

           事实上,正如[2]中所说,实时光线跟踪还需要克服下面几点难点:

           Parallesim并行:无论是何种方法,为了在有限计算能力下得到最大的性能提升,并行处理都是必须的。这一点在GPU上得到充分表现,而CPU上的并行计算依赖于有经验的设计和出色的算法。

           Efficiency效率:我们需要在画质和速度中追求一个平衡点,找到最适合的采样数目,避免额外的而对画质的提升没有帮助的计算。

           Independence From Geometry独立于几何体:事实上这才是真正我们需要关注的,毫无疑问,体渲染光线投射在实现上更加的有效,可是它只能处理Volumn Texture,体积大处理速度慢来源少;传统的模型体积小来源广泛,优化分割算法成熟,但是却更适合光栅化处理,速度更快,效果也不差。而且真实的场景中,Raytracer应该无论是Volumn TexturesIndexed Models都可以一视同仁的处理。

           我相信会有越来越多的程序依赖或者逐渐采用全局光照技术,从GPU Gems1/2中的静态/动态遮挡算法的进化,到NVIDIA OpenGL SDK 10Render To 3D Texture的展示,还有采用Volumn Rendering技术的新一代游戏的出现,全局光照技术将应用的越拉越广泛。

     

    相关技术文档下载

    [1]Alexander Keller Instant Radiosity

    [2]Wald et al. Realtime Ray Tracing and its use for Interactive Global Illumination 

    以后我会详细的收集相关技术文章给大家打包下载

    有几本书我很感兴趣,不知道什么地方有的下载,麻烦直到的朋友告诉我一声

    Programming Mental Ray和Realtime Rendering

    谢谢啦

  • 相关阅读:
    Java加密与解密之非对称加密算法
    Java加密与解密之对称加密算法
    Java加密与解密之消息摘要算法
    基于Spring Cloud Zookeeper的服务注册与发现
    .NET 5.0正式发布,新功能特性(翻译)
    C# 9.0 中的新增功能
    C# 规范建议
    Flutter Weekly Issue 70
    Android 开发技术周报 Issue#298
    Flutter Weekly Issue 69
  • 原文地址:https://www.cnblogs.com/Jedimaster/p/694967.html
Copyright © 2020-2023  润新知