本文是视频课程《Unity技术美术TA:Shader篇》,算是对自己学习的总结,也希望分享下所学知识~~
渲染路径:
为进行光照计算而设计的渲染方式
Unity有哪些?
1.前向渲染路径(Forward Rendering Path)
默认的
2.延迟渲染路径(Deferred Rendering Path)
将着色计算进行延后处理的一种渲染方式
两个Pass:
a.几何处理 G-BufferPass
- RT0,ARGB32:Diffuse
RGB:Color,漫反射颜色
A:Occlusion,环境光遮蔽 - RT1,ARGB32:Specular
RGB:Color,高光颜色
A:Roughness,粗糙度 - RT2,ARGB2101010:WorldSpace
RGB:Normal,法线坐标 - RT3,ARGB2101010
RGB(HDR):Emmision+Lighting+Lightmap+Reflection Probe - RT4,ARGB32(shadowmask专用)
Light Occlusion - Depth+Stencil Buffer,深度+模板缓存
b.光照处理 Lighting Pass
只需渲染出一个屏幕大小的二维矩形
使用G-buffer中存储的数据对此矩阵的每一个片段进行光照计算
优点:
a.影响一个物体的光源数量是没有限制的
b.每个光源都是逐像素级别
缺点:
a.不支持半透明效果
b.不支持抗锯齿
c.内存开销比较大
d.不支持正交相机(支持 fallback)
支持条件
a.显卡必须支持 Multiple Render Targets(MRT)多渲染目标
b.ShaderModel在3.0以上
c.手机在OpenGL3.0以上
3.顶点照明渲染路径(Vertex Lit Rendering Path)
优点:
a.性能最优
b.支持的硬件最广
c.一个物体仅渲染一次,所有光照计算都在顶点执行
缺点:
a.不支持下像素级别的级别,比如阴影、高质量高光等
Shader中如何区分渲染路径?
Unity 可以通过设置决定
设置之后 shader如何识别的?
//如果不标记就会在任何渲染管线下都执行
// 如:LightMode = ForwardBase 只会在前向渲染执行
Tags { "LightMode" = "XXX" }
LightMode有哪些?
Always:默认
ForwardBase:前向渲染中的基础Pass
ForwardAdd:前向渲染中的额外Pass
Deferred:延迟渲染
ShadowCaster:渲染对象的shadowmap或者depthTexture
MotionVectors:用于计算物体的MotionVectors
PrepassBase:旧的延迟渲染
PrepassFinal:旧的延迟渲染
Vertex:顶点光照渲染(无贴图)
VertexLMRGBM:定点光照(PC 有贴图)
VertexLM:顶点光照渲染(Mobile 有贴图)
Unity中的灯光类型
1.Direction 平型关
2.Point 点灯
3.Spot 聚光灯
4.Area 面光灯,仅用于烘焙
前向渲染路径
最常用的
特点:
一个物体会受到多个灯光影响时,可能会产生一个或者多个 Pass
渲染方式:
1.逐像素(精细,高质量)
2. 逐顶点
3.SH球谐
潜规则:
1.如果一个灯被标记为 Not important,则这个灯会采用逐顶点或SH
2.最亮的平行灯采用逐像素
3.被标记为 Important的等采用逐像素
4.如果上面产生逐像素的灯数量小于工程中的设置数量,会有更多的灯会采用逐像素
两种 RenderMode:
a.ForwardBase
仅用于一个逐像素的平行灯,以及所有的逐顶点与SH(需要实现三种方式)
可以合批,一次渲染出来
越靠近物体中心,效果越好。同一个物体最多支持4个逐顶点照明,后面都走SH
b.ForwardAdd
用于其他所有的逐像素灯