Foward渲染路径下的光照

来源:互联网 发布:sis001最新域名 编辑:程序博客网 时间:2024/04/29 08:55

1.在Camera的渲染路径为Forward的时候,测试列子为下:

(1)2个方向光和4个点光源,RenderMode 都为 Not Important时

只会调用ForwarBase,不会调用ForwarAdd

ForwardBase : _LightColor0 的xyzw都是0,_WorldSpaceLightPos0 的xyzw都是0

ForwardAdd: 不会被调用


(2)2个方向光,RenderMode 都为 Not Important. 4个点光源, RenderMode 为 2个Not Important 2个Important

not important的光会调用ForwardBase一次, important的光会依次调用 ForwardAdd(这里调用两次,因为有2个important光)

ForwardBase : _LightColor0 的xyzw都是0,_WorldSpaceLightPos0 的xyzw都是0

ForwardAdd: _LightColor0 和 _WorldSpaceLightPos0 的值会在每次调用该pass的时候被设置为对应光源的颜色和位置

如果我们没有设置Blend模式,那么测试时感觉两次调用该pass,后一次调用会覆盖掉先调用的,如果设置了

Blend One One 会将两次的颜色混合在一起


(3)2个方向光,RenderMode 都为 Important. 4个点光源, RenderMode 为 4个Not Important 

由于2个方向光都为Important,Unity会根据光的强度选择出一个方向光来调用ForwardBase ,另外一个方向光去调用ForwardAdd, 其余的4个点光源会调用调用ForwarBase,

ForwardBase只会被调用一次,在这里不会调用5次。

ForwardBase : _LightColor0 的xyzw是方向光的颜色,_WorldSpaceLightPos0 的xyzw是方向光的朝向 (注意:区别于ForwardAdd中,那里是代表的光的位置),其余的4个点光源他们的颜色和位置会设置在变量:half4[4] unity_LightColor 和 unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0

ForwardAdd: _LightColor0 和 _WorldSpaceLightPos0 的值会是另外一个方向光的颜色和方向


总结:

(1)第一个Pixel平行光调用ForwardBase Pass,其余的每个Pixel光源都会在个单独的ForwardAdd Pass内被执行,也就是说场景中的Pixel光源数为n,则ForwardAdd Pass会被执行n-1次。


(2)(着重看看!!)在Forward路径下,我们可以手动将创建15个光源,并且都设置为Important,然后材质shader选用diffuse,会发现可以完整的看到这15个光的效果,不会受到 editor-》quality-》中的pixel light count 的限制,并且如果我门修改光源的数量为5,6,7....等等,发现都可以看到效果,那么是怎么实现的呢,可以支持动态光源数量的照明? 答案是:unity为每个光都调用了一次pass(forwardAdd),然后把结果叠加在一起,这就意味着有多少个光源就要渲染多少次该光源所照射的物体,如果这15个光照射一个特别大的场景,有物体10万个,那么就要在一次update的时候,就要渲染每个物体15次,调用15*10 = 150万从pass, 渲染压力是很大的。

优化方式:我们可以将这15个光源的计算都放到一个pass中,一次性就算完成,但是!!(但是之前都是废话),这样的灵活性会很低,因为场景中的光分散在不同位置,

当我们一个人,走动的时候,接收的光照数量会动态的改变,那么怎么办?我想的是可以动态的替换shader来达到目的,比如人物受光数量区间为1-15,那么我们可以为

写15个shader,分别计算1个灯光,2个灯光,。。。15个灯光、 然后在代码中动态判断该人物受到多少个光源照射,替换对应的shader来达到目的


(3)上面说道editor-》quality-》中的pixel light count ,这是限制的作用发生在我们将Light RenderMode 设置为Auto的时候,才会起作用,可以让尽可能多个光变成pixel光。






原创粉丝点击