【GAMES101】Lecture 12 阴影 Shadow Mapping

这里是光栅化的最后一部分,讲这个光栅化里面怎么实现这个阴影

实际上阴影就是光源看不到的地方但是是我们能看到的地方,那这个地方就应该有阴影,那具体怎么做呢,这个就叫做Shadow Mapping,分两步做

我们之前说过这个解决远近问题用的深度缓冲Z-Buffer,会用一个depth buffer存储像素的深度,类似的,这里把这个光源当作摄像机,然后去记录一次像素的深度,这样记录到的像素的深度都是光源可以看到的点的深度,因为光源看不到的点的深度会被覆盖对不对

然后我再从摄像机出发去记录像素的深度,这时记录下的像素的深度都是我能够看到的点的深度,如果这个点投影到光源的深度和第一轮记录的深度一样,那么说这个点光源和我都能看到,那这里应该没有阴影

如果摄像机看到的点投影到光源的深度和第一轮记录的深度不一样,那么说明这个点我能够看到,但是光源看不到,那么说明此处应该有阴影

实际操作中那么第一轮就会得到这个和深度缓冲Z-buffer一样的depth buffer深度图

然后去比较摄像机能够看到的点投影到光源的距离是否和depth buffer记录的相等,就是下面的绿色部分,非绿色部分就是应该存在阴影

然后其实可以看到这里绿色的部分不是很均匀,这几个球上颜色有点混乱,这个说明这个阴影不是非常理想,为什么会出现这种情况呢?主要有两个原因,一呢是因为浮点数精度问题,计算机二进制存储嘛,有些小数无法精确表示,那么就导致这个比较浮点数相等这个事情比较困难,那改成大于行不行呢,其实还是不行,还有大于某个阈值也不能根本解决这个问题;二呢是因为这个分辨率问题,就是这个采样问题,一个像素可能覆盖很多点,那每个点都有距离对吧,那我这个像素上不上阴影呢,这也是问题

还有就是它只能解决这个点光源的硬阴影,就是下面这个上面的阴影,就是阴影都是一样的,而无法表示这个软阴影,就是渐变的阴影,因为如果这个光源它不是点光源,它就会产生这种软阴影

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 10:22:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 10:22:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 10:22:02       87 阅读
  4. Python语言-面向对象

    2024-01-31 10:22:02       96 阅读

热门阅读

  1. SparkSQL之函数解析

    2024-01-31 10:22:02       49 阅读
  2. compose LazyColumn + items没有自动刷新问题

    2024-01-31 10:22:02       62 阅读
  3. CF97B Superset 题解 分治

    2024-01-31 10:22:02       58 阅读
  4. 【kafka-01数据保留时间设置】

    2024-01-31 10:22:02       63 阅读
  5. 华为HI模式与华为智选模式的左右互博

    2024-01-31 10:22:02       51 阅读