它们是专门为在Forward渲染路径下渲染物体而设计的两种Pass,ForwardBase会先于ForwardAdd执行。
Unity的Camera的三种PathRendering:Vertex Lit、Forward和Deferred Lighting三种。
1、在Vertex Lit渲染模式下,Forward Base和Forward Add的LightMode都不被支持。
2、ForwardAdd Pass需要和ForwardBase一起使用,否则会被Unity忽视掉。
3、在Forward和Deferred渲染路径下,Forward的Pass都能被正常渲染。
二、Forward渲染路径下的重要光源
Unity的Light有Render Mode属性,包含两种:Important和Not Important。注:光源带颜色。
要检测_WorldSpaceLightPos0在ForwardBase和ForwardAdd的Pass内的状况。在ForwardAdd Pass内的顶点函数内,color=_WorldSpaceLightPos0x。并且使用Blend One Zero的混合模式,可以输出最后执行的ForwardAdd Pass的输出,如果未被执行,将会输出ForwardBase Pass的结果。
结论是:_WorldSpaceLightPos0只会含有Pixel(逐像素)光源。在ForwardBase Pass内,只有场景中存在Important的逐像素平行光时,才会含有有效的_WorldSpaceLightPos0和_LightColor0的组合。
三、重要光源在ForwardAdd内的执行
除了第一个逐像素平行光之外(在ForwardBase Pass执行),其他每个Pixel(逐像素)光源都会在一个单独的ForwardAdd Pass内被执行,即场景中的Pixed光源数为n,则ForwardAdd Pass会被执行n-1次。对于将会被传到ForwardAdd内的每一个Pixel光源,Unity也是按照强弱的顺序依次让它们在ForwardAdd Pass内执行的。
四、ForwardBase和Unity存放光源的第一种方式
1、Vertex(逐顶点)光源,以及其他会被处理成Shader的光源会在ForwardBase内被计算。unity_4LightPos[X,Y,Z]0组合中包含4个Vertex点光源的数据,对应的unityL_LightColorl[0,1,2,3,4]数组都有正确的对应数据(光源颜色)。
2、逐个将点光源改为平行光,对应的光源也会逐个被移除unity_LightPos[X,Y,Z]0。
只有ForwardBase时的总结:在Forward和Deferred模式下,ForwardBase Pass内的unity_LightPos[X,Y,Z]0和unity_LightColor[4]只含有点光源,逐像素光源的排名更靠前。
又含有ForwardAdd时存放光源数据第一种方式的总结: Unity会在ForwardBase Pase内的unity_4LightPos[X,Y,Z]0中只放置Vertex点光源,并且数据都是在世界坐标内,不是相机空间内。
五、ForwardAdd和Unity存放光源的第一种方式
在ForwardAdd Pass内,unity_4LightPos[X,Y,Z]0组合和对应颜色数据只包含Vertex点光源,不含有任何Pixel光源或者平行光。这其实是为ForwardBase Pass内的unity_4LightPos[X,Y,Z]所准备的数据未被清除而已。对于每一个Pixel光源来说,ForwardAdd的Pass都会执行一次,所以不要在ForwardAdd Pass内计算unity_4LightPos[X,Y,Z]0中的数据。
六、Forward渲染路径和Unity存放光源的第三种方式
unity_LightPosition[4]中存储的确实是视空间中的光源估息,也就是当前Camera空间的光源的方向矢量或者位置。在ForwardBase和ForwardAdd内从不包含任何有效数据。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)