转载:小道

透视阴影贴图(Perspective Shadow Maps, PSMs)是由Stamminger和Drettakis在

SIGGRAPH 2002上提出的一种阴影贴图(Shadow Maps)流派的方法。

透视投影贴图方法的基本思想是,为了减少或消除阴影贴图的失真走样,对投射到大像素区域的物体取最大的阴影贴图纹素密度

这章提出了一种优化透视阴影贴图(Perspective Shadow Maps)方法的新思路,对其三种缺陷都一一进行了改进。

【核心要点】

这章首先讲到动态阴影的创建,目前主要有两个算法流派:

  • 阴影体(shadow volumes)/模板阴影(stencil shadows)
  • 阴影贴图(Shadow Maps)

阴影体和阴影贴图算法之间的不同之处在于,是涉及到物体空间(object space)还是图像空间(image space)。

  • 阴影体(Shadow Volumes)是物体空间(Object Space)的阴影算法,通过创建表示阴影遮挡的多边形结构来工作,这意味着我们始终具像素精确但较"硬"的阴影。此方法无法处理没有多边形结构的对象,比如经过alpha测试修改的几何图形或经过位移映射的几何体(displacement mapped geometry)。此外,绘制阴影体需要大量的填充率,这使得很难将它们用于密集场景中的每个对象上,特别是在存在多个灯光时。
  • 阴影贴图(Shadow Maps)是图像空间(Image Space)的阴影算法,它可以处理任何物体(如果能够渲染一个物体,就能得到它的阴影),但是存在走样(aliasing,锯齿)的问题。走样时常发生在有较宽或全方位光源的大场景中。问题在于阴影映射中使用的投影变换会改变阴影贴图像素的大小,因此摄像机附近的纹理像素变得非常大。因此,我们必须使用巨大的阴影贴图(四倍于屏幕分辨率或更高)来实现更高的质量。尽管如此,阴影贴图在复杂场景中却比阴影体要快得多。

透视阴影贴图(Perspective Shadow Maps, PSMs)是由Stamminger和Drettakis在SIGGRAPH 2002上提出的一种阴影贴图(Shadow Maps)流派的方法,通过使用在投射后空间(post-projective space)中的阴影贴图来去除其中的走样,而在投射后空间中,所有近处的物体都比远处的大。不幸的是,使用原始算法很困难,因为只有要某些情况下才能正常工作。

以下是透视阴影映射算法的三个主要问题和解决方案:

、当光源在摄像机后面的时候,有一个虚拟的摄像机锥体。若在锥体内保持所有潜在的阴影投射体,阴影质量就会变得很差。

解决方案:是对光源矩阵使用特别的投射变换,因为投射后空间可以使用某些在通常空的世界空间中不能做的投射技巧。它使我们可以建立特殊的投射矩阵,可以看做"比无限远更远"。

、光源在摄像机空间中的位置对阴影质量影响很大,对于垂直的方向光,完全没有走样问题,但是当光源朝向摄像机并迎面靠近它时,阴影映射走样就很严重。

解决方案:把整个单位立方体保持在一个阴影贴图纹理中,对于遇到的问题,有两个办法,每个办法仅解决问题的一部分:单位立方体裁剪法,把光源摄像机对准单位立方体的必要部分;立方体映射法,使用多个纹理来存储深度信息。

、最初的文章没有讨论过偏置(bias)问题。偏置是随透视阴影贴图而带来的问题,因为纹素的面积以不均匀方式分布,这意味着偏置不再是常量,而是与纹素的位置有关。

解决方案:使用在世界空间中的偏置(而且不再分析双投射矩阵的结果),然后把这个世界空间偏置转换到投射后空间。


得到的阴影实时渲染结果(多边形10w ~ 50w个,分辨率1600x1200)。

【本章配套源代码汇总表】

Example 14-1计算立方体阴影纹理坐标(Shader Code for Computing Cube Map Texture Coordinates)

Example 14-2在顶点Shader中计算偏置(Calculating Bias in a Vertex Shader)

Example 14-3 紧邻百分比过滤的顶点Shader伪代码(Vertex Shader Pseudocode for PCF)

Example 14-4 用于紧邻百分比过滤的像素Shader伪代码(Pixel Shader Pseudocode for PCF)

【关键词提炼】

阴影渲染(Shadow Rendering)

阴影贴图(Shadow Maps)

透视阴影映射(Perspective Shadow Maps,PSMs)

紧邻百分比过滤(percentage-closer filtering ,PCF)

单位立方体裁剪法(Unit Cube Clipping)

 
 

来自 <https://github.com/QianMo/Game-Programmer-Study-Notes/blob/master/Content/%E3%80%8AGPU%20Gems%201%E3%80%8B%E5%85%A8%E4%B9%A6%E6%8F%90%E7%82%BC%E6%80%BB%E7%BB%93/README.md#%E4%B8%80%E3%80%81-%E7%94%A8%E7%89%A9%E7%90%86%E6%A8%A1%E5%9E%8B%E8%BF%9B%E8%A1%8C%E9%AB%98%E6%95%88%E7%9A%84%E6%B0%B4%E6%A8%A1%E6%8B%9F%EF%BC%88effective-water-simulation-from-physical-models%EF%BC%89>

 
 

(转) GEM透视阴影贴图的更多相关文章

  1. Shadow Map阴影贴图技术之探 【转】

    这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...

  2. C# vb .net实现透视阴影特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的透视阴影特效效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 ...

  3. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图 本章介绍一种在游戏和应用中,模拟动态阴影的基本阴影 ...

  4. Tableau绘制漏斗图、甘特图、瀑布图、镶边面积图、阴影坡度图

    Tableau绘制漏斗图.甘特图.瀑布图.镶边面积图.阴影坡度图 本文首发于博客冰山一树Sankey,去博客浏览效果更好.直接右上角搜索该标题即可 一. 漏斗图 数据源 1.1 分色直条漏斗图 (1) ...

  5. {转自MC}NVIDIA DirectX 11演示DEMO详解

    http://tieba.baidu.com/p/1960826986 图形技术无论如何发展,最终都要落到实际的应用中才有效果.在个人电脑上,图形技术最大的用户除了显示UI和操作界面外,就是呈现美轮美 ...

  6. OpenGL 阴影之Shadow Mapping和Shadow Volumes

    先说下开发环境.VS2013,C++空项目,引用glut,glew.glut包含基本窗口操作,免去我们自己新建win32窗口一些操作.glew使我们能使用最新opengl的API,因winodw本身只 ...

  7. OpenGL超级宝典笔记——深度纹理和阴影 【转】

    目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面). ...

  8. WebGL学习笔记(九):阴影

    3D中实现实时阴影技术中比较常见的方式是阴影映射(Shadow Mapping),我们这里也以这种技术来实现实时阴影. 阴影映射背后的思路非常简单:我们先以光的位置为视角进行渲染,我们能看到的东西都将 ...

  9. DirectX11 With Windows SDK--31 阴影映射

    前言 阴影既暗示着光源相对于观察者的位置关系,也从侧面传达了场景中各物体之间的相对位置.本章将起底最基础的阴影映射算法,而像复杂如级联阴影映射这样的技术,也是在阴影映射的基础上发展而来的. 学习目标: ...

随机推荐

  1. 对IIS7经典模式和集成模式的理解(转载)

    从IIS6新增应用程序池的概念,到现在IIS7,对HTTP请求处理功能已经越来越精确化和不断改善,IIS7应用程序池新增了经典模式和集成模式可供选择,不管官方还是一些书籍或文章都有介绍,但多数过于官方 ...

  2. servlet,过滤器,监听器,拦截器的区别

    一.目录 1.概念 2.生命周期 3.职责 4.执行过程 二.内容 概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性, 可以动态生成web页面它 ...

  3. Oracle中常用的语句

    1.查询锁表 SELECT a.object_name,b.session_id,c.serial#,c.program,c.username,c.command,c.machine,c.lockwa ...

  4. Inconsistant light map between PC and Mobile under Unity3D

    Author: http://www.cnblogs.com/open-coder/p/3898159.html The light mapping effects between PC and Mo ...

  5. App 运行后屏幕顶部和底部各留黑边问题 - iOS

    App 启动后屏幕的顶部和底部各产生一条黑边,App 的内容会被压缩在两个黑条内显示,比例失调的情况. 初步判断是启动页资源图片适配问题. 首先,查看工程 project => General ...

  6. windows搭建本地IIS服务器+php安装+移动设备内网访问服务器

    启动IIS服务 1. 打开 “控制面板” => "程序" => "启用或关闭Window功能": 2. 接着勾选相应设置: 3. 继续勾选对应目录下 ...

  7. Java实现“睡排序”——线程池Executors的使用

    前提 之前在知乎上看见一个有意思的排序算法——睡排序. 睡排序最早好像是4chan上一个用户用shell脚本实现的: 算法思想简洁明了:利用进程的sleep来实现 越大的数字越迟输出. 虽然像2L说的 ...

  8. PHP通过curl向其它服务器发请求并返回数据

    在很多时候,我们都需要请求第三方的服务器来获取一些数据,比如token,比如百度的主动推送,那么我们的php如何实现向第三方服务器发请求呢?我们可以通过curl来实现 首先定义请求的url,然后创建h ...

  9. [转]MySQL常用字符串函数

    本文转载自:http://www.cnblogs.com/geaozhang/ 是最常用的的一种函数,在一个具体应用中通常会综合几个甚至几类函数来实现相应的应用: 1.LOWER(column|str ...

  10. 【Android】添加依赖包

    貌似好像不知一种方法,以后有时间再研究,下面是其中的一种方法