unity的渲染路径

三种渲染路径:

  1. 前向渲染路径(ForwardRenderingPath)
  2. 延迟渲染路径(DeferredRenderingPath)
  3. 顶点照明渲染路径(VertexLitRenderingPath)unity5.0后弃掉
  • 大多数情况下,一个项目只使用一种渲染路径

渲染路径的设置

  • 通过摄像机和player中的Rendering path来设置
  • 每个pass中使用标签来指定该pass使用的渲染路径【p181】

前向渲染路径

两个缓冲区:

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

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

  1. 逐顶点处理
  2. 逐像素处理
  3. 球谐函数(Spherical Harmonics,SH)处理

逐像素处理

  • 被设置成Important的光源 /
  • 场景中最亮的平行光 / 
  • 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 = 你需要的值;)

pass中的光照计算

向前渲染的两种pass: 

对于向前渲染来说一个unity shader 会定义一个BasePass(也可以多个,如双面渲染)和一个Additional。

一个BasePass仅执行一次,而一个Additional会根据影响该物体的其他逐像素光源的数目被多次调用,即每个逐像素光源执行一次Additional

1.Base Pass

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

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

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

2.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变种,这些变种会处理不同条件下的渲染逻辑
例如:是否使用光照贴图,是否开启阴影,当前处理哪种光源类型


顶点照明渲染路径

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

 延迟渲染

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

  1. 不计算光照,只看是否可见,仅把光照计算的相关信息储存到G缓冲区中。
  2. 利用G缓冲中的信息进行真正的光照计算
  • 延迟渲染的效率不依赖于场景的复杂程度,而是和我们使用的屏幕空间的大小有关
  • 适合场景中光源数目很多的,并且每个光源都会按照逐像素的方式处理
  • 缺点:
  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和光强衰减纹理

猜你喜欢

转载自blog.csdn.net/ABigDeal/article/details/82776708
今日推荐