SRP_06_BakedShadowMask


一、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
  • image-20221118123040094
  • 不使用 OcclusionProbe LPPV
  • image-20221118123051672

管线及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光照计算的时候,实时光动态减去光照贴图中遮蔽的部分

image-20221118141940853

image-20221119152216421


文章作者: 血魂S
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 血魂S !
  目录