Shader中的光照模型(六)

【本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出

一句话总结
延迟渲染路径:先判断,把要渲染的片元存储在一个地方,再利用存储的各个片元信息进行光照计算(渲染)。
前向渲染路径:把物体接受不同光的强度(位置、设置),进行区别对待(渲染)。

6.7 灯光阴影

前面实现的光照模型还存在以下问题:

  • 开启灯光投射阴影选项,物体上没有投射任何阴影,也不会接受其它物体投射的阴影
  • 当灯光类型切换为聚光灯或者点光源的时候,光照效果依然和平行光一样(只会受到方向的影响,更改灯光位置不会有任何光照变化)

在实现灯光阴影前,先了解一下渲染路径

6.7.1 渲染路径

不同的渲染路径,渲染出来的效果(光照、阴影)不太一样。应该根据游戏内容、硬件类型选择合适的渲染路径。
当然Unity也会自动选择渲染路径:当设置的延迟着色不能被执行时,前向渲染会被采用。

1. 延迟着色渲染路径
  • 含义:将着色器步骤推迟处理,是实现最逼真光影效果的渲染路径,即使场景中有成百上千的实时灯光也能保持流畅的渲染帧率(前提是显卡得跟上)
  • 原理:延迟渲染主要包含两个Pass,
    • 1.Pass1:利用深度缓冲技术,计算哪些片元是可见的,将其片元信息存储在G缓冲区
    • 2.Pass2:利用G缓存区中的各个片元信息(表面法线、视角方向、漫反射系数)进行真正的光照计算
  • 缺点:
    • 不支持真正的抗锯齿功能
    • 不能处理半透明物体
    • 对显卡有一定要求(显卡必须支持MRT,shader mado 3.0、深度渲染纹理、双面模板缓冲)
    • 无法接受阴影
    • Culling Mask只能在限定条件下使用,最多只能使用4个
    • 不支持正交投影(摄像机会自动使用前向渲染)
  • 要求:多重渲染目标、shader model3.0+、支持深度渲染贴图的显卡上运行;移动端:OpenGL ES 3.0+
  • 适用于:光源数目多,显卡配置较高
2. 前向渲染路径
  • 含义:传统的渲染路径,支持所有的图形功能(法线贴图、逐像素光照、阴影)。前向渲染下,对于一个物体周围的灯光来说,是会被区别对待的(灯光自身位置、设置和强度等)

  • 原理:部分最亮的灯光以逐像素照明渲染,之后4个以逐顶点方式渲染,其余以更快速的SH(球谐)光照渲染,如下图:
    在这里插入图片描述
    为避免不同灯光组

    • 几点注意:1.灯光组件的渲染模式设置为Not Important的灯光总是以逐顶点或者SH的方式渲染
    • 2.渲染模式设置为Important的灯光总是逐像素渲染
    • 3.最亮的平行光总是逐像素渲染
    • 4.如果逐像素光照的灯光数量少于项目质量设置中的Pixel Light Count的数量,那么其余比较亮的灯光也会被逐像素渲染
    • 5.上面的图中显示D和G重复了,是unity为避免交界处产生明显缺陷,将不同灯光组进行重叠(大概就是重复渲染的意思)
      在这里插入图片描述
      在这里插入图片描述
  • 缺点:显示效果没有延迟渲染好,网上也有评论说,延迟渲染就是 伪光追

两种渲染路径特性对比
在这里插入图片描述
在这里插入图片描述

在前向渲染的时候,几何渲染输出结果为颜色和深度,因此只需要将这两个缓冲区容量扩大就可以了。
但是对于延迟渲染,因为其几何渲染输出的为光照前数据,包含诸如Albedo、法线、金属度、粗糙度、AO、次表面散射、材质编号等等多种数据,会使用远多于前向渲染的缓冲区,将这些缓冲区全部增大数倍甚至十数倍(如16xMSAA),对GPU显存的开销极大,而且大大增加了深度测试所需读写的数据量,以及PS着色器需要写入的数据量,使得渲染性能也降低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值