一、ShadowMask Bake Mode
简述
与 indirect Bake Mode 类似,只不过将静态物体的阴影信息也烘焙出来,写入到 ShadowMask 贴图中
ShadowMask
静态物体将阴影烘焙到 ShadowMask 贴图中
Light 的模式设置
Realtime
- 纯实时光计算,不会有任何信息烘焙进 lightmap
Mixed
间接光(indirect)烘焙到 lightmap
阴影烘焙到 ShadowMask 中
直接光 (direct)实时计算
Baked
- 直接光信息和间接光信息都烘焙到 lightmap 中
OcclusionProbe
动态物体如果需要接受静态物体的阴影可以使用 OcclusionProbe
OcclusionProbe 数据在 ShadowMask 模式下与 LightProbe 使用相同的位置,会通过unity传入到 unity_ProbesOcclusion,LightProbe 数据是通过球谐参数传入的
OcclusionProbe LPPV
较长的物体也可以使用LPPV,OcclusionProbe 也有LPPV
- 使用 OcclusionProbe LPPV
- 不使用 OcclusionProbe LPPV
管线及Shader使用
SortingSettings sortingSettings = new SortingSettings(_camera)
{
criteria = SortingCriteria.CommonOpaque
};
DrawingSettings drawingSettings = new DrawingSettings(UnlitShaderTagId, sortingSettings)
{
enableDynamicBatching = useDynamicBatching,
enableInstancing = useGPUInstancing,
perObjectData =
PerObjectData.ReflectionProbes |
PerObjectData.Lightmaps | PerObjectData.ShadowMask | //启用光照贴图、ShadowMask贴图
PerObjectData.LightProbe | PerObjectData.OcclusionProbe | //启用 LightProbe、OcclusionProbe
PerObjectData.LightProbeProxyVolume | PerObjectData.OcclusionProbeProxyVolume | //启用对应 LPPV 模式
};
drawingSettings.SetShaderPassName(1, LitShaderTagId);
FilteringSettings filteringSettings = new FilteringSettings(RenderQueueRange.opaque, renderingLayerMask: (uint) renderingLayerMask);
_context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings);
_context.DrawSkybox(_camera);
if (_useColorTexture || _useDepthTexture)
{
CopyAttachments();
}
sortingSettings.criteria = SortingCriteria.CommonTransparent;
drawingSettings.sortingSettings = sortingSettings;
filteringSettings.renderQueueRange = RenderQueueRange.transparent;
_context.DrawRenderers(_cullingResults, ref drawingSettings, ref filteringSettings);
使用 ShadowMask 贴图方法
//需要使用宏定义 静态物体会开启 SHADOWS_SHADOWMASK
#pragma multi_compile _ SHADOWS_SHADOWMASK
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/ImageBasedLighting.hlsl"
//OcclusionProbe
float4 unity_ProbesOcclusion;
//LPPV
//LightProbeProxyVolume 和 OcclusionProbeProxyVolume 使用同一个数据结构
// 如果使用了 LPPV, unity_ProbeVolumeParams.x 为 1
float4 unity_ProbeVolumeParams;
float4x4 unity_ProbeVolumeWorldToObject;
float4 unity_ProbeVolumeSizeInv;
float4 unity_ProbeVolumeMin;
//ShadowMask
TEXTURE2D_FLOAT(unity_ShadowMask);
SAMPLER(samplerunity_ShadowMask);
//LPPV
TEXTURE3D_FLOAT(unity_ProbeVolumeSH);
SAMPLER(samplerunity_ProbeVolumeSH);
// lightMapUV 计算,使用第二套 UV
// float2 lightMapUV : TEXCOORD1;
// output.lightMapUV = input.lightMapUV * unity_LightmapST.xy + unity_LightmapST.zw;
float4 SamplerBakedShadows( float2 lightMapUV, Surface surfaceWS)
{
#ifdef LIGHTMAP_ON
return SAMPLE_TEXTURE2D(unity_ShadowMask, samplerunity_ShadowMask, lightMapUV);
#else
if (unity_ProbeVolumeParams.x) //LPPV
{
return SampleProbeOcclusion(
TEXTURE3D_ARGS( unity_ProbeVolumeSH, samplerunity_ProbeVolumeSH),
surfaceWS.position, unity_ProbeVolumeWorldToObject,
unity_ProbeVolumeParams.y, unity_ProbeVolumeParams.z,
unity_ProbeVolumeMin.xyz, unity_ProbeVolumeSizeInv.xyz
);
}
else
{
return unity_ProbesOcclusion;
}
#endif
}
ShadowDistance 结合
- ShadowDistance 模式
在实时光距离范围内
- 静态物体和动态物体都能投射阴影,都使用实时阴影控制
在实时光距离范围外
- 静态物体使用 ShadowMask 来计算阴影
- 动态物体使用 OcclusionProbe 来计算阴影
ShdowMask 模式
在实时光距离范围内
- 静态物体不能投射阴影,一直使用 ShadowMask 来计算阴影
- 只有动态物体可以投射阴影,使用实时阴影计算
在实时光距离范围外
- 静态物体使用 ShadowMask 来计算阴影
- 动态物体使用 OcclusionProbe 来计算阴影
二、Subtractive Bake Mode(不常用,限制比较大)
简介
其他都差不多,唯一不同的是:
- Light 的模式设置 Mixed 的灯光,即作为实时光,又会全量烘焙到光照贴图(即烘焙直接光,也烘焙间接光),在shader光照计算的时候,实时光动态减去光照贴图中遮蔽的部分
