- 渲染细节:
- 根据影响物体的光源不同,正向渲染用单个或者多个通道来渲染物体;
- 在正向渲染中光源本身也会根据他们的设置和强度受到不同的对待。
- 实现细节:
- 在正向渲染中,影响物体最亮的几个光源使用逐像素光照模式(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和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass。其中ForwardBase会优先于ForwardAdd渲染。
- 通道细节:
- 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
- ForwardBase:Base Pass applies one per-pixel directional light and all per-vertex/SH lights。ForwardBase通道渲染一个逐像素方向光和所有的顶点/球面调和光。此通道还负责渲染着色器中的光照贴图,环境光和自发光。在此通道中渲染的方向光可以产生阴影。
- 下面是官方给出的对光源不同处理
假设光源A到H都有相同的颜色和强度,且它们的渲染模式都为自动的(Auto),那么它们严格的按照其名字排序。最亮的光源以逐像素光照模式的方式进行渲染(A到D),然后最多有4个光源以逐顶点光照模式进行渲染(D到G),其他光源以球面调和的方式进行渲染(G到H)
可知:由第四点通道细节,在ForwardBase中只渲染一个逐像素方向光A和所有球面调和光。即 A E F G H;其他光源在ForwardAdd中渲染。
官方强调球面调和光很快很高效。
自己的理解
ForwardAdd没必要和ForwardPass一起使用。毕竟不同的通道做了不同的事情。如果在场景中有多个光源的情况ForwardAdd也可以单独生效。比如下面的shader在场景中有多个光源的情况下可以输出鲜亮的大红。Shader "Tut/Lighting/Forward/Lab_0/FwdAddX" {
SubShader {
pass{
Tags{ "LightMode"="ForwardAdd"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//#pragma multi_compile_fwdadd
#include "UnityCG.cginc"
#include "Lighting.cginc"
struct vertOut{
float4 pos:SV_POSITION;
float4 color:COLOR;
};
vertOut vert(appdata_base v)
{
vertOut o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.color=float4(1,0,0,1);
return o;
}
float4 frag(vertOut i):COLOR
{
return i.color;
}
ENDCG
}//end pass
}
}
重要光源在ForwardAdd内的执行:
- 在ForwardBase内只有场景中存在RenderMode为Important的pixel平行光时,_WorldSpaceLightPos0和_LightColor0的组合会生效。如果光源为点光源_WorldSpaceLightPos0是生效的_LightColor0不生效。