一渲染细节:
- 根据影响物体的光源不同,正向渲染用单个或者多个通道来渲染物体;
- 在正向渲染中光源本身也会根据他们的设置和强度受到不同的对待。
- 实现细节: 渲染通道:ForwardBase和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass。其中ForwardBase会优先于ForwardAdd渲染。
- 在正向渲染中,影响物体最亮的几个光源使用逐像素光照模式(per-pixel lit mode)。
- 接下来,最多有4个点光源会以逐顶点渲染方式被计算。
- 其他光源将以球面跳河的方式进行计算。
- 判断一个光源是否为逐像素光源的依据:
- 渲染模式被设置为不重要的光源不用逐像素光照模式计算。
- 最亮的方向光源为per-pixel。Brightestdirectional light is always per-pixel.
- 如果根据以上规则的到的像素光源数量小于Quality Setting中的Pixel Light Count,为了减少亮度,将会有更多的光源以逐像素的方式进行渲染。If the above results in less lights than current Pixel Light Count Quality Setting, then more lights are rendered per-pixel, in order of decreasing brightness.
- 通道细节:
下面是官方给出的对光源不同处理- ForwardBase:Base Pass applies one per-pixel directional light and all per-vertex/SH lights。ForwardBase通道渲染一个逐像素方向光和所有的顶点/球面调和光。此通道还负责渲染着色器中的光照贴图,环境光和自发光。在此通道中渲染的方向光可以产生阴影。
- ForwardAdd:Other per-pixel lights are rendered in additional passes, one pass for each light。其他的像素广在附加通道中进行渲染,每个光源都需要一个通道。在这些通道中渲染的光源无法产生阴影。
- 以上可知:前向渲染支持一个能产生阴影的方向光。so in result, Forward Rendering supports one directional light with shadows
假设光源A到H都有相同的颜色和强度,且它们的渲染模式都为自动的(Auto),那么它们严格的按照其名字排序。最亮的光源以逐像素光照模式的方式进行渲染(A到D),然后最多有4个光源以逐顶点光照模式进行渲染(D到G),其他光源以球面调和的方式进行渲染(G到H)
可知:由第四点通道细节,在ForwardBase中只渲染一个逐像素方向光A和所有球面调和光。即 A E F G H;其他光源在ForwardAdd中渲染。
官方强调球面调和光很快很高效。
二、注意点
*ForwardBase、ForwardAdd的LightMode只能运行在Came为Forward、DeferredLighting的渲染模式下
*ForwardAdd这个Pass需要和ForwardBase一起使用,否则会被Unity忽视掉
* ForwardBase只对1个有效灯光执行一次
* ForwardAdd对除了ForwardBase用的那个灯光外的所有有效灯光都执行1次,所以会被执行多次
LightMode=Forward中的_WorldSpaceLightPos0,_LightColor0
*灯光在ForcePixel模式下才有效
*如果只有一个平行灯光,ForwardAdd中使用不到灯光数据
*ForwardBase的Pass中,灯光需要是方向光
*ForwardAdd优先点光源,
* ForwardAdd优先灯光比较暗的,ForwardBase优先比较亮的 。他们正好相反
LightMode=ForwardBase(只有这一个的情况下)中的unity_4LightPosZ0[3], unity_4LightAtten0[3], unity_LightColor[3], unity_LightColor3
*只对点光源有效
*灯光在ForcePixel,ForceVertex模式下都有效,ForcePixel的优先
*灯光范围必须覆盖目标
*灯光亮度必须大于0
*对灯光强度排序,亮的优先。
LightMode=ForwardBase(包含ForwardAdd,Blend Zero One)中的unity_LightColor[3], unity_LightColor3
*只对点灯光有效
*当只有一个点灯光时ForcePixel,ForceVertex都有效
*当有多个点灯光时,如果其中有是ForceVertex的。则只有ForceVertex有效,ForcePixel无效
*当有多个点灯光时,如果都是ForceVertex。则有效
*灯光数据是在世界坐标内
LightMode=ForwardAdd(Blend One Zero)中的unity_LightColor[3], unity_LightColor3
*首先需要有两个ForcePixel的方向光或者一个ForcePixel的点光为前提条件
*需要是ForceVertex的点等光才有效
*当开始有几个满足效果,把他们一个一个设置为不满足时unity_LightColor[3]会残留一个未被清理的数据,所以建议使用unity_LightColor3
LightMode=ForwardBase(只有这一个的情况下)中的unity_LightPosition[3], unity_LightAtten[3]
*没有数据
LightMode=ForwardAdd(Blend One Zero)中的unity_LightPosition[3], unity_LightAtten[3]
*没有数据
*有其他材质球时unity_LightPosition[3]会看到那些残留数据