一种在平面上以任意角度投下矩形阴影的方法

一种在平面上以任意角度投下矩形阴影的方法

要在 Y=0 平面下使用平行光投下矩形阴影,请使用以下方法构建view矩阵(Unity)。

Vector3 center = Vector3.zero;
var viewMatrix =  new Matrix4x4(new Vector4(1, 0, 0, 0), new Vector4(0, 0, 1, 0), lightDirection, new Vector4(center.x, center.y, center.z, 1));

注意:lightDirection与Shader中的LightDir定义不同。

当ShadowMap的分辨率较低、地面为平面时,此方法可以获得较高质量的阴影。也可以用在风格化的游戏上,作为特别的视觉效果。一般情况下,当你使用点采样以及较低分辨率的阴影时,性能能得到很大提升。

此方法可以在一个平面上稳定的投下矩形阴影。如果projection矩阵没有改变,则不会出现闪烁现象。在y不等于0的平面随着光源方向的改变阴影的位置会缓慢改变。

原理:矩阵可以表示空间的变换,因此使用以下方法构建矩阵。把世界坐标的X轴对齐阴影映射的X轴,世界坐标的Z轴对齐阴影映射的Y轴,再将光源对齐Z轴即可表示一个在XZ平面上形状为矩形的坐标变换。(我数学不好,可能这样的描述并不准确)

要在其他平面上(使用阴影映射)投下矩形阴影,请选择在该平面上正交的两个(标准化的)向量,选择该平面上一点为center,然后计算矩阵。

这个方法我早在2022年6月就发现了,我现在将它分享到网上。

协议:CC-BY-SA 4.0

作者:sselecirPyM