unity的渲染路径

渲染路径 RenderingPath:

  • Unity支持三种RenderingPath(渲染路径)
  1. Forward Rendering Path(前向渲染路径)
  2. Deffered Rendering Path(延迟渲染路径)
  3. VertexLit Rendering Path(顶点照明渲染路径)(抛弃)
  • 大多数情况下,一个项目只使用一种渲染路径
  • 设置渲染路径:unity的渲染路径_第1张图片

 

LightMode标签:

  标签名 描述
  Always 不管使用哪种渲染路径,该Pass总会被渲染,但不会计算任何光照
* ForwardBase 用于向前渲染。该Pass会计算环境光,最重要的平行光,逐顶点/SH光源和Lightmaps
* ForwardAdd 用于向前渲染。该Pass会计算额外的逐像素光源,每个Pass对应一个光源
* Deferred 用于延迟渲染。该Pass会渲染G缓冲(G-buffer)
* ShadowCaster 把物体的深度信息渲染到阴影映射纹理(shadowmap)或一张深度纹理中
  PrepassBase 用于遗留的延迟渲染。该pass 会渲染法线和高光反射的指数部分
  PrepassFinal 用于遗留的延迟渲染。该pass通过合并纹理,光照和自发光来渲染得到最后的颜色
  Vertex等 用于遗留的顶点照明
  • 代码示例:
Pass{
    Tag{"LightMode"="ForwardBase"}
        巴拉巴拉。。。
}
  • 不同的LightMode 被选择的顺序
  1. VertexLit渲染路径下: 有Vertex   执行 ,没有不执行任何Pass。Always类型:只执行V的,代码靠前先执行效果混合          
  2. Forward渲染路径下:有Forward 执行,无F 有Vertex 执行 ,无F无V有Deferred 不执行。Always类型:按照代码位置
  3. Deferred渲染路径下:有Deferred 执行,无D 有Forward 执行, 无D无F有Vertex 执行。Always类型:不执行
  • Unity 在一个时间只会执行一个渲染路径下的Pass,并不会将全部可执行Pass都渲染。

前向渲染路径

两个缓冲区:

  1. 颜色缓冲
  2. 深度缓冲(决定光源是否可见)

向前渲染的三种处理光照的方式

  1. 逐顶点处理(Vertex):Not Impotant,
  2. 逐像素处理(Pixel):Important,最亮的平行光,
  3. 球谐函数(Spherical Harmonics,SH):Not Impotant,
  • ProjectSetting-> Quality中的Pixel Light Count 参数,逐像素光源数量

决定一个光源使用哪种处理模式取决于它的类型和渲染模式

  • 光源类型:平行光还是其他。在light组件Type中设置
  • 光源的渲染模式:该光源是否重要(Important)。在light组件RenderMode中设置

ProjectSetting-> Quality中的VSync Count 参数会影响你的FPS,

  • Don‘t Sync:关闭垂直同步,不建议,关闭后在不同性能的机器上,会帧率不稳定。
  • EveryVBlank相当于FPS=60,但是并不是严格的60,也会高于60,但是不会高太多。当然如果机器卡,会低到50,40,甚至无下限。
  • EverySecondVBlank = 30左右,具体指与上边类似。
  • 如果你想设置为其他值的FPS的话,需要手动调整FPS,首先关闭垂直同步这个功能(即选择Don‘t Sync),然后在代码的Awake方法里手动设置FPS(Application.targetFrameRate = 你需要的值;)

BasePass  &  AdditionalPass

向前渲染的两种pass: 

  • 对于向前渲染来说一个unity shader 会定义一个BasePass(也可以多个,如双面渲染)和一个Additional。
  • 一个BasePass仅执行一次,而一个Additional会根据影响该物体的其他逐像素光源的数目被多次调用,即每个逐像素光源执行一次Additional
  • Base会先于Add被执行

    BasePass:

Tags{"LightMode"="ForwardBase"}
#pragma multi_compile_fwdbase

//一个逐像素的平行光以及所有逐顶点和SH光源

/*可实现的光照效果
光照纹理
环境光
自发光
阴影(平行光的阴影)*/

   Additional Pass:

Tags{"LightMode"="ForwardAdd"}

//混合模式,光照叠加
Blend One One

#pragma multi_compile_fwdadd

//其他影响该物体的逐像素光源,每个光源执行一次Pass

/*默认情况下不支持阴影,通过替换编译指令开启阴影
//#pragma multi_compile_fwdadd_fullshadows
但这需要unity在内部使用更多的shader变种*/

#pragma multi_compile_fwdbase/fwdadd
保证unity可以为相应的类型的Pass生成所需要的shader变种,这些变种会处理不同条件下的渲染逻辑
例如:是否使用光照贴图,是否开启阴影,当前处理哪种光源类型

向前渲染可用的光照变量

名称 类型 描述
_LightColor0 float4 该pass处理逐像素光源的颜色
_WorldSpaceLightPos0 float4

_WorldSpaceLightPos0.xyz是该Pass处理逐像素光源的位置。

如果该光源是平行光,那么.w是0,其他光源类型w为1

_LightMatrix0 float4x4 从世界空间到光源空间的变换矩阵,可以用于采用cookie和光强衰减(attenuation)纹理

unity_4LightPosX0,

unity_4LightPosY0,

unity_4LightPosZ0

float4 仅用于BasePass。前4个非常重要的点光源在世界空间中的位置
unity_4LightAtten0 float4 仅用于BasePass。储存了前4个非常重要的点光源的衰减因子
unity_LightColor float4[4] 仅用于BasePass。储存了前4个非常重要的点光源颜色

 

 


顶点照明渲染路径

  • 对硬件配置要求少,运算性能最高,效果最差。
  • 不支持阴影,法线映射,高精度的高光反射等
  • 所有可以在顶点照明中实现的功能都可以在前向渲染路径中完成
  • 如果选择使用顶点照明渲染路径,那么unity会只填充那些逐顶点相关的光源变量,意味着我们不可以使用一些逐像素光照变量
  • 在未来顶点照明可能会被移除

 延迟渲染

延迟渲染主要包含两个pass:

  1. 用于渲染G缓存。不计算光照,只看是否可见,仅把光照计算的相关信息(漫反射颜色,高光反射颜色,平滑度,法线,自发光,深度等)储存到G缓冲区中。这个Pass只执行一次。
  2. 用于计算真正的光照模型。利用G缓冲(Geometry-buffer)中的信息进行真正的光照计算,将最终的光照颜色储存到帧缓存中。
  • 延迟渲染的效率不依赖于场景的复杂程度,而是和我们使用的屏幕空间的大小有关
  • 适合场景中光源数目很多的,并且每个光源都会按照逐像素的方式处理
  • 缺点:
  1. 不支持真正的抗锯齿(anit-aliasing)功能
  2. 不能处理半透明物体
  3. 对显卡有一定要求

 

默认的G缓存区包含的渲染纹理(Render texture,RT):

  • RT0:格式是ARGB32,RGB通道用于储存漫反射颜色,A通道没有被使用。
  • RT1:格式是ARGB32,RGB通道用于储存高光反射颜色,A通道用于储存高光反射的指数部分。
  • RT2:格式是ARGB2101010,RGB通道用于储存法线,A通道没有被使用。
  • RT3:格式是ARGB32(非HDR)或ARGBHalf(HDR),用于储存自发光+lightmap+反射探针(reflection probes)。
  • 深度缓冲和模板缓冲

当在第二个pass中计算光照时,默认情况下仅可以使用unity内置的Standard光照模式

 

 

延迟渲染路径中可以使用的内置变量
名称 类型 描述
_LightColor float4 光源颜色
_LightMatrix0 float4x4 从世界空间到光源空间的变换矩阵,可以用于采样Cookie和光强衰减纹理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


参考:

《Unityshader入门精要》第九章

《Unity ShaderLab 开发实战详解》第五六七八章

 

 

 

你可能感兴趣的:(unity的渲染路径)