「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」
古人说的好,目遇之而成色。 眼睛遇到了光线,人就看到了颜色。大多数情况下,人眼看见的是反射光,既然有反射光,那说明我们看见的这个物体的后面(光线方向)一定有阴影。
对于影子来说,也和光源一样,要分平行光和点光源。有点类似透视投影和平行投影, 我们先假设,现在有一个光屏正对光的方向,点光源则光源与光屏的中心连线垂直光屏。 至于说为什么要假定这样一种特殊位置,当然是因为容易算,先算特殊的,然后从特殊到一般。
影子最重要的就是光线的方向,这点和相机是一样的。只不过之前的相机是接受光线的,现在我们把相机的视点当做光源,视线就是光照的方向。
有影子的地方就是光源看不见的地方,有距离光源更近的物体挡住了光线。
光源看不见,就是色彩会黯淡一些。我们的眼睛就看见了影子。
那么在webgl中,如何呈现影子? 一般先将投影贴图在缓冲帧中绘制出来,存到纹理单元中,也就是光源看到的图。就是视点与光源重合的时候看到图。
可以先想象就是平原,平地,这就是一幅图。 这幅图的每个图元的深度也就都知道了, 这个深度就是指当前这个视线下的,z轴坐标。
这里存储的是webgl的坐标,也就是剪裁空间的坐标,z轴是垂直屏幕朝里的,因此z值小的在表面,z值大的,在里面会被表面的所遮挡。
然后,在绘制当前相机所看到的图。这个时候同样,我们知道要画的每个点的坐标。 通过视图矩阵变换,让当前相机与光源重合,从而得到,在光源相机下的各点。
最后,去对比,相同xy的z,y也就是深度 在这个图上我们拿每个片元去和投影贴图上的对应的片元进行对比, 如果当前片元的深度,大于投贴影图上的片元深度,那么这个片元,就处于阴影之中。 我们就应该调低其亮度,这样影子就出来了。
当我们的视点和光源重合的时候,这两张图也就可以直接重合。就是我们最后看到的效果。