实时阴影渲染(一):PSSM平行分割阴影图
PSSM(Parallel Split Shadow Map)平行分割阴影图,是一种根据距离远近采用多个深度纹理渲染阴影的方法
适合用于室外大场景中的平行光比如太阳形成的阴影
本系列需要读者了解基本的深度阴影渲染方面的知识
1 视锥划分
如下图,以采用三个划分为例:

这里将视锥体平行划分为3个区域,代号分别为1、2、3
这三个区域在渲染阴影的时候分别采用不同的阴影图sm1、 sm2、sm3
这样将1、2、3对应的距离数据打包为一个float3变量splits.xyz,传入片段shader,然后通过以下的代码实现阴影图的选择:
if (z <= splits.x)
{
shadow = depthShadow(sm1,...);
}
else if (z <= splits.y)
{
shadow = depthShadow(sm2,...);
}
else if (z <= splits.z)
{
shadow = depthShadow(sm3,...);
}
这里z 、depthShadow函数和单个深度纹理阴影的实现类似,区别是相关参数都变成了三份
图上的三个划分并没有包含全部的渲染区域,因为没有必要渲染特别远的阴影
各个阴影区域的大小可以根据需要选择合理的算法
根据实际情况也可以将阴影区域划分为两个或者更多个
为了平滑 ,最后一级阴影(本例的3)可根据z值做线性淡入淡出
2 投影矩阵计算
渲染阴影前需要分别渲染三个深度纹理
对每一个阴影区域都需要计算对应的正投影矩阵
计算正投影矩阵可以理解为计算正投影相机的位置、投影大小和相机的up矢量
下面以单个投影区域为例说明如何计算这三个要素

如上图,彩色阴影部分为视锥体的单个划分区域
根据当前相机的位置、FOV、纵横比和远近截面距离可以算出该视锥体的八个顶点(这里为了简化仅画出四个)
根据光照方向可以用任一垂直矢量作为投影相机up矢量,不过不同的up矢量得到的投影体大小不同,你可以设计专门的算法计算最优的up矢量
然后再通过光照方向和up矢量的叉积计算出right矢量
任选一参照点(此例为左下的O点),通过up\right矢量和光照方向可以计算出其它7个点在投影相机空间相对于O点的最大、最小值也就是最小包围盒
如图所示,相机的位置应在AB的中点D所在的中心线上,其相对于D点的距离为AC的长度加上阴影可能的投影距离(视锥体外的物体投影)
投影体的长为AB的长度,宽为right方向得到的长度(此图没画出来)
也可以将视锥体的八个顶点直接转到相机空间计算轴对称包围盒、相机位置,然后再将相机位置变换回世界空间
不过当场景很大时,正反两次变换造成的误差会非常的大,直接在世界坐标系内计算则不会有这种问题
实时阴影渲染(一):PSSM平行分割阴影图的更多相关文章
- Unity3D手游开发日记(1) - 移动平台实时阴影方案
阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...
- Unity局部高效实时阴影的思考和实现
http://game.ceeger.com/forum/read.php?tid=23305&fid=2 无意间看到一篇文章,说是Unity5 demo中为了实现角色的良好阴影,单独给角色设 ...
- .NET实时2D渲染入门·动态时钟
.NET实时2D渲染入门·动态时钟 从小以来"坦克大战"."魂斗罗"等游戏总令我魂牵梦绕.这些游戏的基础就是2D实时渲染,以前没意识,直到后来找到了Direct ...
- 【实时渲染】实时3D渲染如何加速汽车线上体验应用推广
在过去,一支优秀的广告片足以让消费者对一辆汽车产生兴趣.完美的底盘线条或引擎的轰鸣声便会让潜在买家跑到经销商那里试驾.现在,广告还是和往常一样,并没有失去其特性,但86%的买家在与销售交流之前会在网上 ...
- (转)阴影锥(Shadow Volume)
转自:http://blog.csdn.net/zjull/article/details/11819923 Shadow Map和Shadow Volume是当今比较流行的实时阴影渲染方法,跟Sha ...
- Unity Shader 卡通渲染 基于退化四边形的实时描边
从csdn转移过来,顺便把写过的文章改写一下转过来. 一.边缘检测算法 3D模型描边有两种方式,一种是基于图像,即在所有3D模型渲染完成一张图片后,对这张图片进行边缘检测,最后得出描边效果.一种是基于 ...
- Shadow Map阴影贴图技术之探 【转】
这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...
- 剖析虚幻渲染体系(14)- 延展篇:现代渲染引擎演变史Part 1(萌芽期)
目录 14.1 本篇概述 14.1.1 游戏引擎简介 14.1.2 游戏引擎模块 14.1.3 游戏引擎列表 14.1.3.1 Unreal Engine 14.1.3.2 Unity 14.1.3. ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图 本章介绍一种在游戏和应用中,模拟动态阴影的基本阴影 ...
随机推荐
- 剑指offer系列40----机器人的运动范围
package com.exe8.offer; /** *[题目]地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动, * 每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标 ...
- java获取url中的参数
获取地址栏中的url中的userName的值 String userName=new String(request.getParameter("userName")); 获取中文的 ...
- 使用MyEclipse可视化开发Hibernate实例
2.7 使用MyEclipse可视化开发Hibernate实例 2.7节的例子源代码在配套光盘sourcecode/workspace目录的chapter02_first项目中. 这个实例主要演示如 ...
- html元素背景样式大小调整
定义元素背景设置 background-size属性cover自适应填充背景,background-size: 100% 100%; background-size: 左右比例 上下比例: 再介绍几 ...
- php全角字符转换为半角函数
<?php /** * 全角字符转换为半角 * * @param string $str * @return string public function Sbc2Dbc($str) { $ar ...
- RedisCacheTool参考其中的文件读写功能
package com.jr.market.tool; import java.io.BufferedReader; import java.io.File; import java.io.FileI ...
- VALGRIND
系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题.有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦.所以,在实践中会用到很多工具来 ...
- PLSQL_性能优化系列13_Oracle Index Rebuild索引重建
2014-10-04 Created By BaoXinjian
- [MySQL] 同步一张表、复制过滤设置
一.缘由 据测试要求,需要把线上一张股票信息的表实时同步到测试环境,那么干吧,这次不复制库,单独复制表. 二.解决办法 可以按照同步(复制)库的方法来,在salve端设置 my.cnf,replica ...
- 《精通SQL Server 2008》笔记
7.3触发器的使用 7.4游标的使用 8索引/关系图/完整性 9用户管理