您的位置:首页 > 移动开发 > Unity3D

Unity3D 渲染路径

2015-08-27 23:03 405 查看
1. 比较Shade中的 LIghtMode 的 Vertex, ForwardBase, Deferred

结论:

在Camera选择Deferred渲染路径下,则会寻找LightMode为Defferred下的Pass,但是如果找不到LightMode为Defferred下的Pass,则会寻找LightMode为ForwardBase下的Pass,如果找不到LightMode为ForwardBase下的Pass,就寻找LightMode为Vertex下的Pass,以上其中一种情况,如果找到的话,就会返回,并不会往下执行其他Pass。

在Camera选择Forward渲染路径下,则会寻找LightMode为ForwardBase下的Pass,但是如果找不到LightMode为Vertex下的Pass, 如果找到的话,就会返回,并不会往下执行其他Pass。

在Camera选择Vertex渲染路径下,则会寻找LightMode为Vertex下的Pass,

无论如何,Unity在一个时间只会执行一个渲染路径下的Pass,它并不会将全部可执行的Pass都渲染。

2. Shader中的 LightMode 的 Always

结论:

如果一个Shader中有一个LightMode为 Always 的Pass,一个LightMode为 Vertex 的Pass, 当Camera的渲染路径是Vertex的时候,Always Pass 的执行和在代码中的位置有关系,在代码中靠前,则先执行,在代码靠后,测后执行。

如果一个Shader中有一个LightMode为 Always 的Pass,一个LightMode为 ForwardBase 的Pass, 当Camera的渲染路径是Forward的时候,Always Pass 的执行和在代码中的位置有关系,在代码中靠前,则先执行,在代码靠后,测后执行。

如果一个Shader中有一个LightMode为 Always 的Pass,一个LightMode为 Deferred 的Pass, 当Camera的渲染路径是Deferred的时候,Always Pass没有执行。

3. Shader的LightMode的默认值(那就是没有明确去设置LightMode)

结论:

与LightMode的Always的结论一样。

(那就是,如果一个Shader中有一个没有声明LightMode的Pass,一个LightMode为 Vertex 的Pass, 当Camera的渲染路径是Vertex的时候,没有声明LightMode的 Pass 的执行和在代码中的位置有关系,在代码中靠前,则先执行,在代码靠后,测后执行。......)

4. Shader的 LightMode 的 ForwardBase 和 ForwardAdd

前提:

场景中有Directional light,其中存在RenderMode为Important(Pixel 光源),也存在Not Important(Vertex 光源)的,有Point light,其中存在RenderMode为Important,也存在Not Important的。(也就是说,同时有Pixel光源,Vertex光源)

结论:

ForwardAdd 要 ForwardBase一起使用,否则会被Unity忽略掉。(也就是说,一个Shader中,如何只有一个LightMode为ForwardAdd的Pass的话,这个Shader就不起作用,要让这个Shader起作用的话,就需要有一个LightMode为ForwardAdd的Pass,一个LightMode为ForwardBase的Pass,两个要同时存在。)

当Camera的渲染路径是Vertex的时候, ForwardBase 和 ForwardAdd 都不会执行。

当Camera的渲染路径是Forward, Deferred的时候, ForwardBase 和 ForwardAdd都会执行。

前提:

哪些光源放在ForwardBase执行,哪些光源放在ForwardAdd执行?

结论:

Pixel光源:

第一个Pixel平行光放在ForwardBase Pass执行,每个其他的Pixel光源(无论是平行光还是点光源...), 都会在一个单独的ForwardAdd Pass 执行,也就是说,场景中的Pixel 光源数为n, 则 ForwardAdd会被执行n-1次。

Vertex 光源:

所有的Vertex 光源,以及其他会被处理成Shader的光源会在ForwardBase内被计算。

官方:

Rendering of each object happens as follows:

Base Pass applies one per-pixel directional light and all per-vertex/SH lights.
Other per-pixel lights are rendered in additional passes, one pass for each light.

最后更多的细节参考官方的: Rendering Pipeline Details



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: