标准的tsm计算方法是将frustum投影到light空间里,在light空间里由投影后的frustum图形计算出梯形的各个极大极小点,然后选取focus和1D投影比例计算q点坐标,由交线得到梯形。然后变换到trapezoid空间。但这样会造成如果眼睛在light的frustum内的时候trapezoid难以计算,影子严重变形,有些算法会对这个进行一些改进,不过实际使用起来并不是太理想。这两天稍微改了下,效果还不错。在camera frustum投影到light空间之后计算出q点后不再由交线算出梯形,而是根据梯形长度直接选取一个长度(试验下来大概跟梯形长度相近)作为梯形的底边,这样防止梯形的两个斜边夹角变成钝角使影子质量变差。然后在变换到trapezoid空间之后对y方向(就是1D投影的方向)增加一个偏移,使梯形的top边不会太接近真实的camera位置(否则会产生光线方向在某个角度的时候影子被切去一部分),这个偏移可以结合到最后一个矩阵里。
   试验下来只要梯形边长度和偏移选取正确,即使眼睛非常接近光线方向,也不会造成影子变形或被切掉。