Unity渲染路径
什么是渲染路径(rendering path)
渲染路径决定了光照是如何应用到unityshader中。
一般一个项目只使用一种渲染路径:
open Editor
关闭use defaults即可设置
设置多个渲染路径
可以在不同相机中设置不同的渲染路径
如果显卡不支持,unity会自动降一级渲染路径
标签名 描述 Always 不管使用哪种路径,该pass总是会被渲染,但不会计算光照 ForwardBase 用于向前渲染,会计算环境光,最重要的平行光,逐顶点/SH光源和Lightmaps ForwardAdd 向前渲染,会计算额外的逐像素光源,每个pass对应一个光源 Deferred 延迟渲染,渲染G-buffer ShadowCaster 把物体的深度信息渲染到阴影纹理映射(shadowmap)或一张深度纹理中 PrepassBase 遗留的延迟渲染,会渲染法线和高光反射的指数部分 PrepassFinal 遗留的延迟渲染,通过合并纹理,光照,自发光来渲染最后得到的颜色 Vertex,VertexLMRGBM,VertexLM 遗留的顶点照明渲染
向前渲染路径(Foward Rendering Path)
1 | Pass{ |
渲染对象的渲染图元并计算两个缓冲区
- 颜色缓冲区
- 深度缓冲区:决定是否可见
- 对于每个逐像素光照都需要单独计算pass,当物体受到多个逐像素光照时,就要计算多个pass,N(物体数量)*M(逐像素光照)
- 三种处理光照的方式:逐顶点处理,逐像素处理,球谐函数(SH)处理
unity渲染优先级
最亮的平行光按照逐像素处理
渲染模式为Not Important的使用逐顶点和SH渲染。
Important使用逐像素
在以上规则后逐像素光源数量小于Quailty Setting 中的Pixel Light Count,则会有更多光源以逐像素处理
两种pass的标签和渲染设置以及常规光照计算
#pragma multi_compile_fwdbase #pragma multi_compile_fwdadd 只有为两个pass使用这两个编译指令,才可以在pass中得到正确的光照变量,比如光照衰减值。
Base Pass可实现的光照效果:光照纹理,环境光,自发光,阴影(平行光阴影)
Add Pass默认没有阴影,可以使用#pragma multi_compile_fwdadd_fullshadows为点光源和聚光灯开启阴影。
Add Pass中需要开启混合模式,否则会覆盖,一般选择Blend One One
内置的光照变量和函数
向前渲染可以使用的内置光照变量
名称 | 类型 | 描述 |
---|---|---|
_LightColor0 | float4 | 逐像素光源颜色 |
_WorldSpaceLightPos0 | float4 | _WorldSpaceLightPos0.xyz是光源位置,如果是平行光,_WorldSpaceLightPos0.w为0,否则为1 |
_LightMatrix0 | float4x4 | 世界空间到光源空间的变换矩阵,可以用于采样cookie和光强衰减纹理 |
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0, | float4 | 仅用于base pass,前4个非重要点光源在世界空间的位置 |
unity_4LightAtten0 | float4 | 仅用于base pass,前4个非重要点光源的衰减因子 |
unity_LightColor | half4[4] | 仅用于base pass,前4个非重要点光源的颜色 |
向前渲染的内置光照函数
函数名 | 描述 |
---|---|
float3 WorldSpaceLightDir(float4 v) | 仅向前渲染,输入模型空间的顶点位置,返回世界空间中 点到光源的方向,未归一 |
float3 UnityWorldSpaceLightDir(float4 v) | 仅向前渲染,输入世界空间的顶点位置,返回世界空间中 点到光源的方向,未归一 |
float3 ObjSpaceLightDir(float4 v) | 仅向前渲染,输入模型空间的顶点位置,返回模型空间中 点到光源的方向,未归一 |
float3 Shade4PointLights(…) | 仅向前渲染,计算4个点光源的光照。 |
延迟渲染路径(Deferred Rendering Path)
unity 5.0后新的延迟渲染替代旧的延迟渲染
原理:包含两个pass
第一个pass:只执行一次,不进行光照计算,仅计算可见性,通过深度缓冲技术实现。如果可见,则将各类信息存入G缓冲当中。
第二个pass利用G缓冲的信息,进行真正的光照。
延迟渲染的效率不依赖场景的复杂度,而是与屏幕空间的大小有关。
unity中的延迟渲染
适合场景光源较多的情况,如果使用向前渲染会造成性能瓶颈。
每个光源都可以当做逐像素处理。
缺点:
- 不支持真正的抗锯齿
- 不能处理半透明
- 对显卡有要求:支持MRT,Shader Mode3.0以上,深度渲染纹理和双面模板缓冲。
默认的G缓冲区包含
- RT0,格式为ARGB32,RGB用于存储漫反射颜色,A通道未利用
- RT1,格式为ARGB32,RGB用于存储高光反射颜色,A通道存放高光反射指数
- RT2,格式为ARGB2101010,RGB存放法线,A未利用
- RT3,格式为ARGB32(非HDR)或ARGBHalf(HDR),用于存储自发光+lightmap+反射探针
- 深度缓冲和模板缓冲
可使用的内置变量
名称 | 格式 | 描述 |
---|---|---|
_LightColor | float4 | 光源颜色 |
_LightMatrix0 | float4x4 | 世界空间到光源空间的变换矩阵,用于采样cookie和光照衰减纹理 |
顶点照明路径(Vertex Lit Rendering Path)
unity 5.0后被抛弃
配置要求最少,性能最高,效果最差。P185
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 雨夜!