一种在平面上以任意角度投下矩形阴影的方法
一种在平面上以任意角度投下矩形阴影的方法
要在 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