市面常见游戏引擎中,主要采用以下三种灯光实现方式:
1.顶点照明渲染路径的细节 Vertex Lit Rendering Path Details
2.正向渲染路径的细节 Forward Rendering Path Details
3.延迟光照渲染路径的细节 Deferred Lighting Rendering Path Details
以unity3d为例,介绍三种灯光渲染方式的实现原理和缺陷。
顶点照明渲染路径细节:
实现:顶点照明渲染路径通常在
【一个通道中渲染物体】,所有光源的照明都是在
【物体的顶点上】进行模拟计算的。
优势:
是最快的渲染路径并且有最广泛的硬件支持。
缺陷:因为光照都是在顶点上计算的,此渲染不支持大部分的逐像素渲染效果,如:阴影,法线贴图,灯光遮罩,高精度高光等。
正向渲染路径细节:
特性:
1.影响物体
【最亮的几个光源】是使用
【逐像素光照渲染】。
2.最多
【4个点光源】会以
【逐顶点光照渲染】方式计算。
3.其他光源将以
【球面调和(SphericalHarmonics,顶点计算,不支持投影遮罩,法线贴图)】的方式计算,速度快,但只能得到近似值。
设置:
1.渲染模式设置为
【不重要(NotImportant)】时,以
【逐顶点】或
【球面调和】方式计算。
2.最亮的【方向光源】为【像素光源】
3.渲染模式设置为
【重要(Important)】时,以
【逐像素】方式计算。
4.如果以上规则中得到的【像素光源数量】小于【质量设置中的像素光源数量】,为了减少亮度,会有更多光源以逐像素的方式进行渲染。
用例:
假设光源A到H都有相同的颜色和强度,且它们的渲染模式都为自动的AUTO,那么它们严格的按照其名字排序。最亮的光源以逐像素光照模式的方式进行渲染(A到D),然后最多有4个光源以逐顶点光照模式进行渲染(D到G),其他光源以球面调和的方式进行渲染(G到H)。
实现:
1.基础通道渲染一个
【逐像素方向光(可产生阴影)】和所有的
【逐顶点/球面调和光】。还负责
光照贴图(无法得到球面调和光),环境光,自发光。
2.其他
【逐像素光】在
【附加通道】中进行渲染,每个光源需要一个通道。
附加通道无法产生阴影。
延迟光照渲染路径细节:
特性:
1.延迟光照是一种当前最高级的能实现光线和阴影保真的渲染路径
2.对于能影响任何物体的光线数量没有上限
3.完全采用以
每像素的方式评估光线,这等于意味着全部将以正常贴图的方式正确的和物体交互
4.所有光线都能拥有信息缓存
5.所有的光线
都能产生阴影
优点:
1.光照的开销与屏幕的光线尺寸成正比,不用担心光线所照射的物品的数量,少量光线等价于廉价的花费
2.一致性,所有的光线的光照采用按像素为计算分割单位来计算。比如,不会有在大规模三角形情况下光照计算使计算性能发生崩溃的情况发生。
缺点:
1.没有实时抗锯齿支持
2.延迟光照
不能处理半透明物体,也不能用在哪些使用前向渲染的物体之上
3.有限的光照模式支持(Blinn-Phong)。所有光照以同样的方式计算,你不能够在不同的物体上采用完全不同的光照模式
4.没有对接收阴影特征的支持和对光线遮罩剔除有限的支持
5.目前在
移动平台不支持
性能开销:
1.延迟光照中实时光线的
开销和光线照亮的
【像素值的数量】成
正比。而不取决于场景的复杂性。微小的点光源和聚光灯光源非常容易渲染。点光源或者完全或者部分
被场景物体遮挡的聚光灯光源所照射的像素则被GPU所跳过,因此
更加廉价。
2.当然,
拥有阴影的光源比
没有阴影的光源要
昂贵许多。使用延迟光照,光影投射器仍然需要为每个阴影投射渲染一次或者多次。而且产生阴影的光线着色器也比不产生阴影的光线着色器要昂贵许多。
实现:
1.基本渲染:被渲染的对象产生带有深度,法线,和反射量的屏幕空间缓冲。
本渲染的结果是被屏幕内容填满的Z缓冲和带有法线和高光强度的渲染纹理。
2.光照渲染:使用
上一步的缓冲计算出光照。结果放入
另一个屏幕空间缓存
3.最后渲染:物体再次渲染。取来
已经计算好的光线和颜色纹理混合在一起,然后再
加上环境光以及散射光照。
其他:
lightingmap烘焙贴图不在及时光的技术范围内。烘焙灯光是
通过贴图记录光照信息来模拟固定的光照效果,场景中本身不包含及时灯光。
Rendering PathsComparison 渲染路径比较
|
Deferred Lighting 延时光照 |
Forward Rendering 正向渲染 |
Vertex Lit 顶点光照 |
Features 功能 |
|
|
|
Per-pixel lighting (normal maps, light cookies) 每像素计算光照(法线贴图、灯光cookies) |
Yes |
Yes |
- |
Realtime shadows 实时阴影 |
Yes |
1 Directional Light(一盏平行光) |
- |
Dual Lightmaps 双光照贴图 |
Yes |
- |
- |
Depth&Normals Buffers 深度与法线缓冲区 |
Yes |
Additional render passes 额外渲染通道 |
- |
Soft Particles 软粒子 |
Yes |
- |
- |
Semitransparent objects 半透明的物体 |
- |
Yes |
Yes |
Anti-Aliasing 抗锯齿 |
- |
Yes |
Yes |
Light Culling Masks 灯光剔除蒙板 |
Limited |
Yes |
Yes |
Lighting Fidelity 光照保真度 |
All per-pixel 全部像素 |
Some per-pixel 某些像素 |
All per-vertex 所有顶点 |
Performance 性能 |
|
|
|
Cost of a per-pixel Light 每像素光照的花费 |
Number of pixels it illuminates 照亮的像素数 |
Number of pixels * Number of objects it illuminates 像素数*照亮的像素数 |
- |
Platform Support支持平台 |
|
|
|
PC (Windows/Mac) 台式机 |
Shader Model 3.0+ |
Shader Model 2.0+ |
Anything |
Mobile (iOS/Android) 移动设备 |
- |
OpenGL ES 2.0 |
OpenGL ES 2.0 & 1.1 |
Consoles (游戏)平台 |
360, PS3 |
360, PS3 |
- |