表面 (Surface):场景中所有网格的所有三角形都称为场景的表面。表面点是为场景定义的任意三角形内的点。
发光 (Emitted Light):这是直接发射到场景表面的光。
直射光 (Direct Light):这是发出后照射到场景的表面再被反射到传感器(例如眼睛的视网膜或摄像机)中的光。一个光源的直接贡献是从该光源到达传感器的任何直射光。
间接光 (Indirect Light):这是发出后接触到场景的表面至少两次并最终反射到传感器中的光。一个光源的间接贡献是从该光源到达传感器的任何间接光。
粗糙表面会在许多方向上散射入射光,可照亮未直接从光源获得光照的表面。场景中的表面越粗糙,此类阴影区域就会越明亮。过去,这种效果是通过定义一个额外的环境光颜色来近似计算的,这种颜色只是简单地添加到直接光照的结果中,因此阴影中的表面看起来不会完全变黑。更复杂的近似算法使用渐变来根据表面的方向模拟不同的环境颜色,甚至使用球谐函数来获得更复杂的环境光照。
光滑或光泽表面可在可预测的方向上反射大部分入射光,从而在材质上产生可见的高光。光滑表面的极端例子是镜子:来自一个方向的所有入射光恰好反射到另一个方向。光泽反射的一种变体是半透明材质,这种材质还可在入射光进入和再次离开材质时折射光线。
在间接光照的情况下,光路与场景表面至少有两次交互。这些交互可以是光泽表面和/或粗糙表面反射的组合。例如,照射到粗糙表面的光泽反射/折射将显示从所有观察方向可见的聚焦明暗图案,称之为焦散。照射到另一个粗糙表面的粗糙反射通常称为环境光照。
由于光在场景表面上多次反射的性质,正确的解决方案需要考虑整个场景及其所有相关光路的所有表面材质属性和光交互。因此有了全局光照一词。
射线追踪是在计算机图形学中解决这一问题的非常巧妙的方法,因为它试图通过追踪场景中的光线路径来模拟现实世界中实际发生的情况。目前,电影业已完全转向射线追踪技术来生成图像。
遗憾的是,射线追踪仍然太慢,无法在大多数实时图形中使用;取而代之是采用光栅化 (rasterization) 作为生成图像的标准方法。与射线追踪不同,光栅化不能跟踪场景中的任意光路。事实上,光栅器只能计算光路的一段。这就是实时图形中的光照变得复杂的原因。
由于光栅器不能跟踪光线,因此实时光照集中于具有最明显影响的光照部分。这些部分就是发射部分,更常见的说法是直接光照。即使在这样的情况下,光路也已经由两段组成:一段是从摄像机到表面,另一段是从表面到光源。
第一段是从摄像机位置渲染的视图。为了计算第二段,需要使用阴影贴图之类的技术。由于阴影贴图特定于每个投射阴影的光源,因此必须为每个光源生成唯一的阴影贴图。投射阴影的光源越多,需要生成的阴影贴图也越多。根据光源的数量,所需的渲染时间可能会很快变得过长。阴影贴图的另一个缺点是它们的分辨率有限。这会导致块状阴影。因此,阴影贴图既存在图像质量问题(由于分辨率有限),也存在性能问题(由于存储阴影贴图的内存要求以及每帧生成阴影贴图所花费的时间)。
与离线渲染不同,游戏对渲染帧的时间长度有一定的严格限制。例如,在 VR 应用程序中,为了实现 90 帧/秒 (FPS) 的帧率,绘制一个帧的时间为 11.11 毫秒 (ms)。在需要玩家快速反应的游戏中,为了达到 60 FPS 的帧率,绘制一个帧的时间为 16.66ms。目标帧率为 30 FPS 的游戏绘制一个帧的时间为 33.33ms。这些时间还必须包括应用程序或游戏其余部分(例如 AI 和物理系统)的计算工作。因此,尽可能提高效率以充分利用系统非常重要。所有渲染必须在少于绘制一个帧所需的时间内发生。
总结一下,需要解决的两个主要问题如下:
1.如何处理因计算直接光照的阴影而导致的性能损失。
2.如何处理间接光照(注意:在实时图形的背景下,全局光照与间接光照同义,即使全局光照的实际意义也包括直接光照)。
2017–06–08 页面已发布
在 5.6 版中添加了“光照模式”
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.