科技企业网站源码,免费虚拟机安卓版,本科专业建设规划,论坛系统这里是光栅化的最后一部分#xff0c;讲这个光栅化里面怎么实现这个阴影
实际上阴影就是光源看不到的地方但是是我们能看到的地方#xff0c;那这个地方就应该有阴影#xff0c;那具体怎么做呢#xff0c;这个就叫做Shadow Mapping#xff0c;分两步做 我们之前说过这个解…这里是光栅化的最后一部分讲这个光栅化里面怎么实现这个阴影
实际上阴影就是光源看不到的地方但是是我们能看到的地方那这个地方就应该有阴影那具体怎么做呢这个就叫做Shadow Mapping分两步做 我们之前说过这个解决远近问题用的深度缓冲Z-Buffer会用一个depth buffer存储像素的深度类似的这里把这个光源当作摄像机然后去记录一次像素的深度这样记录到的像素的深度都是光源可以看到的点的深度因为光源看不到的点的深度会被覆盖对不对 然后我再从摄像机出发去记录像素的深度这时记录下的像素的深度都是我能够看到的点的深度如果这个点投影到光源的深度和第一轮记录的深度一样那么说这个点光源和我都能看到那这里应该没有阴影 如果摄像机看到的点投影到光源的深度和第一轮记录的深度不一样那么说明这个点我能够看到但是光源看不到那么说明此处应该有阴影 实际操作中那么第一轮就会得到这个和深度缓冲Z-buffer一样的depth buffer深度图 然后去比较摄像机能够看到的点投影到光源的距离是否和depth buffer记录的相等就是下面的绿色部分非绿色部分就是应该存在阴影
然后其实可以看到这里绿色的部分不是很均匀这几个球上颜色有点混乱这个说明这个阴影不是非常理想为什么会出现这种情况呢主要有两个原因一呢是因为浮点数精度问题计算机二进制存储嘛有些小数无法精确表示那么就导致这个比较浮点数相等这个事情比较困难那改成大于行不行呢其实还是不行还有大于某个阈值也不能根本解决这个问题二呢是因为这个分辨率问题就是这个采样问题一个像素可能覆盖很多点那每个点都有距离对吧那我这个像素上不上阴影呢这也是问题
还有就是它只能解决这个点光源的硬阴影就是下面这个上面的阴影就是阴影都是一样的而无法表示这个软阴影就是渐变的阴影因为如果这个光源它不是点光源它就会产生这种软阴影