阴影算法,在3D渲染中是很重要的一部分。阴影算法大致可以分为以下三类:基于ray tracing,基于shadow volume,基于shadow map(Z buffer).

Ray tracing可以很自然地实现shadow,不需要特殊处理,但是ray tracing一般都用于离线渲染。Shadow Volume在实时渲染中也有应用,但是Shadow Volume依赖于geometry,而且Volume的生成是比较麻烦的事情。因此在实时渲染中,还是简单的Shadow map运用得最多,基于Shadow Map的论文也是层出不穷。

Shadow map分为两个pass:

(1) 以灯光的位置作为视点,渲染整个场景,把深度值(Z值)写到一张texture(shadow map)中。

(2)以相机所在的位置作为视点,渲染整个场景,在PS中把每个象素P(x,y,z)转换到灯光所在的视空间中对应P`(x`,y`,z`),用(x`,y`)作为uv去采样shadow map中此点的z值Zmap,在与z`比较,如果z` > Zmap,此像素便在阴影中,如果z` < Zmap此像素便不在阴影中。

Shadow Map优点是简单,易于实现。但是Shadow map有alias(走样、锯齿)的问题。为了解决这个问题,很多人提出了很多改进的办法。

1、Percentage-Closer Filtering:

Percentage-Closer Filtering出自论文“Rendering Antialiased Shadows with Depth Maps”,NV的Sample 里面也有,该文采用”Percentage-closer filtering”的滤波方法来解决Shaodow map的走样问题。

其思想很简单,拿文章里的一个图为例,假如某像素转换到灯光视图空间中的Z值为49.8,把这个值与在Shadow Map中3X3的区域的Z值比较,如果49.8小于在Shadow map中对应的Z值,则记为0,表示不在阴影中,反之则记为1。这样得到了右边所示的3X3区域大小的9个值,在对这9个值取平均,得到0.55,以这个值作为在pixel shader中的阴影权值。此方法能够在一定程度上解决alias的问题,而且有软阴影效果。

2、Perspective Shadow Maps

Perspective Shadow Maps来自论文:“Perspective Shadow Maps,SIGGRAPH 2002 by Stamminger and Drettakis”。

该论文把Shadow map的alias问题分为两类:Perspective alias和Project alias. Project alias是因为当灯光照射方向与物体表面夹角比较小时,使得多个pixel对应Shadow map中一个texel,产生alias问题,可以增大shadow map来解决此问题。Perspective alias产生的原因是因为透视透影会产生近大远小的效果,这使得近处的物体有可能多个pixel对应着Shadow map中一个texel, 产生alias问题。Perspective Shadow map就是用于解决这一问题。

Perspective Shadow Maps其实思想还是比较容易理解的。在生成shadow map时,首先将物体以及灯光变换到perspective space中,在perspective space中,整个空间是一个长方体,没有了近大远小的问题,在这个空间中,再以常规方法,以灯光作为视点,生成shadow map.

Perspective Shadow Maps有很多局限性,对光源的位置和类型都有要求,很多情况需要特殊处理,源文中列了一些需要特殊处理的情况。正因为这些限制,使得实现起来比较复杂。但是此论文开了解决Perspective alias的先河,有不少后续文章都是借鉴了此文思想。

3  Light Space Perspective Shadow Maps

该文出自论文:“Light Space Perspective Shadow Maps”,这篇论文是以Perspective Shadow Maps为基础的,是对其的改进。

“Light Space Perspective Shadow Maps”与Perspective Shadow maps的区别是,它在产生shadow map之前,不是先以Camera的View Frustrum作透视投影,而是在和灯光方向垂直的方向构建View Frustrum,以此View Frustrum把灯光和场景转换到Perspective space中,再计算Shadow map.这样的好处在于,平行光源转换后依然是平行光,点光源被转换成了平行光源,克服了Perspective Shadow Maps中的一些问题。

4  Parallel-Split Shadow Maps for Large-scale Virtual Environments

该方法出自论文:” Parallel-Split Shadow Maps for Large-scale Virtual Environments”,

如上图示,Parallel-Split Shadow Maps把View Frustrum按照Z的范围分成三个部份,再分别为这三个部分各自生成Shaodw Map。假如光源不是平行光,可先用Light space Shadow Map的方法转换到Light Space,此时光源便是平行光了。Parallex-Split Shadow Maps是关键在于如何对View Frustrum作合理的切分。

5  Variance Shadow Maps.

Variance Shadow Maps,来自William Donnelly和Andrew Lauritzen的“Variance Shadow Maps”。该方法利用概率论中的期望值、方差和切比雪夫不等式,实在是巧妙。

在前面的Percentage closer filter方法中,我们不能用纹理过滤方法(如高期滤波等)对Shadow Map进行预处理,因为预处理之后结果就会变得不正确,不能反映像素是否在阴影之中,因此只能采样一定范围取差值求平均。而Variance Shadow Maps就没有这个限制。它的方法其实很简单,分为如下几步:

(1)              像生成一般shadow map一样渲染,但是除了把每个像素的深度值d,以及深度的平主 d2记录下来。

(2)              利用一种虑波方法对Shadow map进行处理。

(3)              从相机处渲染场景,在PS中把每个象素P(x,y,z)转换到灯光所在的视空间中对应P`(x`,y`,z`),用(x`,y`)作为uv去采样shadow map中此点的z值和z2记为D和F,采样时可以采用硬件支持的Blinear或Trilinear和AF去采,此时:

期望值E(z) = D,E(z2)=F

那么方差就等于: variance = E(z2) - E(z)2 = F – D2

再根据切比雪夫不等式,计算出阴影参数即可,具体的公式可查阅论文或Nvida对应的Sample.

转载于:https://www.cnblogs.com/cxrs/archive/2010/03/07/1680142.html

Shadow Mapping续相关推荐

  1. Shadow mapping

    http://www.cnblogs.com/cxrs/archive/2009/10/17/1585038.html 1.什么是Shadow Maping?       Shadow Mapping ...

  2. Shadow Mapping 的原理与实践 【转】

    Shadow Mapping 的原理与实践 [转] Shadow Mapping 的原理与实践 [转] posted on 2018-08-16 23:37 时空观察者9号 阅读(...) 评论(.. ...

  3. OpenGL shadow mapping 阴影贴图的实例

    OpenGL shadow mapping 阴影贴图 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #i ...

  4. OpenGL Shadow Mapping阴影贴图的实例

    OpenGL Shadow Mapping阴影贴图 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include "vapp.h" #inc ...

  5. [转载] [OpenGL] shadow mapping(实时阴影映射)

    参考链接: Java中静态函数的阴影(方法隐藏) 转载原创:ZJU_fish1996   http://blog.csdn.net/zju_fish1996/article/details/51932 ...

  6. 3DShader之阴影贴图(Shadow Mapping)

    好久没写shader了,一直被实验室要求作java开发,中间准备了一个月雅思,最近又被老师拉到东莞做Hadoop开发.马上面临毕业的问题了,突然人生苦短,趁有生之年多做点自己喜欢的事情吧,所以最近又开 ...

  7. 【GAMES-202实时渲染】1、软阴影01(Shadow Mapping、Peter Panning、PCSS原理超详细)

    Lecture3 Real-Time shadows1 1 Shadow Mapping回顾 2 Shadow Mapping缺点及解决方案 2.1 自遮挡现象 解决方案1 定义一个bias 解决方案 ...

  8. 【Shading】Shadow Mapping 阴影映射

    课程来源:GAMES101-现代计算机图形学入门-闫令琪 Lecture12 GAMES101 现代计算机图形学入门 主讲老师:闫令琪,UCSB 课程主页:https://sites.cs.ucsb. ...

  9. [OpenGL] shadow mapping(实时阴影映射)

    source:原文地址 code:点击可以直接下载源代码 1978年,Lance Williams在其发表的论文<Casting curved shadows on curved surface ...

  10. 阴影(shadow mapping)(硬阴影)

            着色是一种局部现象,只考虑着色点自己.光源.摄像机,如果我要算出它的着色,完全不考虑其它物体,甚至自己的其它部分对这个着色点的影响.而事实上如果有其它物体挡在 shading poin ...

最新文章

  1. C++:STL标准入门汇总
  2. 5种流行的Web抓取Python库,你用过哪种?
  3. 阅读源码技术与艺术五
  4. 如何读取jar包外的properties文件和log4j.properties
  5. c语言如何把c程序编译成可执行的exe文件
  6. hive插件 ranger_Apache Ranger及Hive权限控制
  7. ubuntu16.04安装驱动
  8. find命令结合exec和xargs使用的区别
  9. 机械制图与计算机绘图实训报告前言,机械制图论文2000字_机械制图总结以及心得2000字_大一机械制图结课论文...
  10. 吐槽国内各大公司的漏洞报告平台
  11. css使用clac()垂直居中
  12. grasps什么意思中文_中文和日文微信名字是什么意思 163个
  13. oracle 数据库导入导出文章
  14. IDEA中怎么调出右下角的版本控制Git
  15. 【串级PID】浅谈串级PID作用及意义——快速理解串级PID结构优势(附图)
  16. C++ Primer 0x0C 学习笔记
  17. java命令行运行 classnotfound_Kotlin测试从ClassNotFoundException的命令行失败,但是从IntelliJ开始工作...
  18. Mapbox icon-image表达式
  19. 1483_人月神话阅读笔记_外科手术队伍
  20. 页式管理 多级页表

热门文章

  1. python的for循环语句range_Python入门第7课,循环结构学习,for语句range函数的3种用法...
  2. javaaop模式供其他项目调用_结构性模型-静态代理模式
  3. opengl 图片处理 卷纸弯曲效果_神笔马良——基于 OpenGL 的涂鸦框架
  4. 【POJ2774】Long Long Message(求两个字符串的最长公共子串----后缀数组)
  5. 【浙江省第16届省赛J:】Welcome Party(并查集+优先队列bfs遍历)
  6. STM32——库函数版——12864点阵显示屏驱动
  7. 翻译: Swift 中信号量的美妙之处
  8. 如何设计实现一个证书加密签名工具包-极客大学架构师训练营(架构师 黄燧)
  9. eda多功能时钟设计_Altera FPGACPLD设计 基础篇+高级篇(附随书光盘)
  10. 微型计算机中call指令,微机原理 第四章 微型计算机指令系统.ppt