UnityGI4:混合光照

前置:UnityGI2:Lightmaps

一、混合模式

前面设置了光源的模式为 Baked,这意味着光源产生的直接光和间接光都会被记录在 lightmap 中,如果着色器不从 lightmap 中采样,那么静态物体得到的表现就是完全的黑暗。除此之外模式为 Baked 的光源,运行时无法调整且没有贡献

如果修改光源模式为 Mixed,那么在烘焙的时候就会只烘焙间接光,并且在运行时该光源被当作实时光产于计算:当然间接光在运行时是不会发生变化的,所以光源在运行的时候也尽量不要过度调整它的位置和属性,不然直接光和间接光可能会对不上

实现这些的前提条件是,LightSetting 里面要设置光照模式为混合照明

关于阴影:Shader 里使用了 LIGHTING_COORDS(7, 8)、TRANSFER_VERTEX_TO_FRAGMENT(o) 和 LIGHT_ATTENUATION(i) 这三个宏去计算了阴影、设置了 FallBack "Specular" 以投射阴影。不过这不能很好的处理透明物体,因此上面实时阴影的表现不太正确,当然这些属于实时光照的内容就不在本章详细介绍了

二、烘焙阴影

前面我们只烘焙间接光,直接光和阴影实时计算。当然阴影也可以让 Unity 帮我们烘焙好,这样在计算实时光照时阴影就也不用考虑,这需要:

  • 在 Lighting 窗口的 Scene 选项卡中设置 LightingMode 为 Shadowmask
  • 确定 Quality 设置(菜单 → Edit → Project Settings)Shadowmask Mode 为 Shadowmask

 

此时 Shader 中计算阴影的时候,就可以直接从阴影的 Lightmap 也就是 Shadowmask 中采样:其中 UnityMixRealtimeAndBakedShadows 方法的第三个参数为阴影距离衰减值,用于实时阴影淡化,可以默认为0

//得到实时光照衰减和阴影
float attenuation = LIGHT_ATTENUATION(i);
#if HANDLE_SHADOWS_BLENDING_IN_GI
    //从阴影lightmap中采样获得静态光源在静态物体下的阴影
    float bakedAttenuation = UnitySampleBakedOcclusion(i.lightmapUV, i.pos);
    attenuation = UnityMixRealtimeAndBakedShadows(attenuation, bakedAttenuation, 0);
#endif

宏 HANDLE_SHADOWS_BLENDING_IN_GI:

#if defined(SHADOWS_SCREEN) && defined(LIGHTMAP_ON)
    #define HANDLE_SHADOWS_BLENDING_IN_GI 1
#endif

2.1 关于 Shadowmask

在只有一个光源的情况下,阴影 Shadowmask 只有 R 通道,为1表示对应坐标可以被光源直接照射,可以确定的是,一个坐标位置最多只能存储4个光源的信息(对应 RGBA 4个通道,因此重叠光源不能超过4个,否则多余的光源会被当作普通烘焙光处理,只记录间接光照

动态物体也可以通过光照探针来获取静态光源的阴影信息,不过效果并不好

除此之外,也可以在 Quality 设置(菜单 → Edit → Project Settings)里面将 Shadowmask Mode 设置为 Distance Shadowmask,在此模式下,近距离为实时阴影,超过 Shadow Distance 之外的地方才会使用烘焙的阴影和光探针

2.2 减法模式

总结一下前面的内容:

  • Baked Indirect 模式 + Baked 光照:烘焙所有光照 (光源在运行时隐藏且无效)
  • Baked Indirect 模式 + Mixed 光照:烘焙仅间接光 + 直接光和阴影实时计算
  • Shadowmask 模式:烘焙间接光和阴影数据 + 直接光实时计算

而还有一种光照模式为减法模式(Subtractive):

  • Subtractive 模式 + Mixed 光照:烘焙所有光照 + 直接光实时计算

使用减法模式的目的是:静态物体通过 lightmap 进行照明,同时在运行时还可以通过调整 lightmap 强度来实现静态物体上展现动态物体的阴影,这即是减色

因为 lightmap 已经包含直接光照了,如果运行时再把光源当成 runtime 模式以计算光照,场景就会过亮:毕竟此时相当于叠加了两份直接光

需要注意的是:

  • 可以支持只有单一平行光的场景,如果有多个光源,可能得到错误的减色结果
  • 在实时阴影与烘焙阴影合成时,实时阴影的颜色可以通过 RealtimeShadowColor 属性设置

参考文档:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值