04_投影追加

投影追加

采样深度图

获取当前深度

除以100是单位转换到m

计算偏移程度

这里乘上5.0是经验值为了方便调整参数,除以深度相当于做透视除法,最后除以100应该是进行百分制的换算,

计算偏移方向,灯光偏移方向

将灯光转换到相机空间,因为是屏幕投影,这里只取XY即可,因为UE屏幕采样的坐标是从左上角开始,那么Y垂直方向向下为正,当前是向下为负,所以这里Y分量需要乘上-1 最后灯光方向乘上偏移的程度就可以得到偏移量

计算偏移后屏幕UV

前面计算的偏移量,因为计算过透视除法,所以转到屏幕空间就需要乘上屏幕像素大小,也就是长宽。SceneTexelSize的值是1/ScreenWidth和1/ScreenLength,所以这里1/SceneTexelSize就可以得到长宽。原UV是像素位置的XY或者说是PositionCS.xy,偏移量与原UV相加这样就可以得到新的UV信息了,这里为了防止采样超过边界所以使用了max和min进行钳制

获取深度缓冲

UE中没有直接获取深度缓冲Pre-Z Pass的节点,所以需要用自定义节点获取。这里要说明,节点的深度PixelDepth也是深度缓冲中得到的,但是采样是使用的PixelPosition.XY,我们需要重新采样 代码

1
2
3
4
5
#if (MATERIALBLENDING_SOLID || MATERIALBLENDING_MASKED) && IS_BASE_PASS
    return ConvertFromDeviceZ(OpaqueBasePass_ResolvedSceneDepthTexture.Load(int3(svPosition.xy, 0)).r);
#else
    return 0;
#endif

计算投影部分

采样得到偏移后的深度后需要与原深度图进行相减,这样就可以获得投影部分了,除以100是为了将单位转换为m,新增ScreenSpaceShadowThreshold用于处理部分自阴影,可以理解为剔除掉距离近的部分阴影,比如鼻尖,面部 投影部分乘上50和除以一个ScreenSpaceShadowFadeOut进行控制阴影的衰减,然后防止过曝钳制到0~1,添加开关ScreenSpaceShadow控制是否开启

预览

调整输出进行预览

将投影追加到光照层级中

这里是代码方便对照节点 在BaseShadowAttenuation混合颜色中间进行混合 当前预览


Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • URP - RendererFeature :ScreenSpaceOutline
  • 平滑法线处理 - 八面体映射
  • Lv.3 Unity主线:一个简单的PBRShader
  • 理论支线:直接光漫反射与GGX高光的混合问题
  • 理论支线:PBR - 基于图像的照明( image based lighting-IBL)
  • # #