《CSM and PCF》

在进行阴影绘制的时候,除了blur整张shadow map之外,实现软阴影的方法还有CSM和PCF。

CSM(Cascaded Shadow Map)即级联shadow map,它的做法是把相机从近裁剪面到远裁剪面分割成N个子视锥,每个视锥渲染一张shadow map。

一般而言,级联shadow map的几级大小是一样的,比如四级,可以在整张shadow map中分成四份,只是一级的shadow map里面的可视区域最小,阴影边缘锯齿也最不明显;第四级的shadow map可视区域最大,用它做出来的阴影的边缘锯齿也就最明显,但是由于使用到这一级的shadow map的物体都是比较远的物体所以可以这种效果。

在分级的时候,比如分4级,原来相机只有一个远裁剪面,现在会分成4个,可以进行线性等分,也可以不等分:

下图中,C0是近裁,Cm是远裁,Ci代表分割线,假如我们想要分割出N个子视锥,那我们就需要求出N-1个Ci。 
 

通用算法是: 

使用混合因子λ将平均切分和指数切分融合起来。

其中,指数切分公式是: 

平均切分的公式是: 

其中,n为近裁,f为远裁,i为切分线,m为子视锥总数。

代入最上面的公式,就能得到最终的切分公式。

利用级联CSM的算法实现shadow map,生成级联的shadow map之后,后面的步骤即和传统的shadow map原理相差不大,不同的是,在传统的shadow map算法中,将当前pixel的坐标转换到light space后,等到的深度值仅仅和唯一的一张shadow map进行比较,现在,在级联shadow map的算发现,是有多张shadow map的,应该根据之前在light space中得到的深度来判断应该使用哪张级联shadow map中的那个,再进行深度比较,其中要注意UV的偏移不要采样到错误的shadow map中的像素,得到错误的比较结果,导致阴影效果出问题。

关于一些CSM的优化;如果camera不动,角色在场景中走动,穿过两级shadow map的时候会发现阴影效果有明显改变,为了解决这种问题,可以让两级shadow map之间有重叠部分,比如重叠20%,然后对两张shadow map产生的阴影进行混合,这样的好处是完成了两级阴影效果之间的平滑过渡,但是坏处是发现当前pixel的深度位于light space的两级视锥之间的时候需要采样两张shadow map,具有额外的矩阵计算和采样消耗。

PCF是Percentage Closer Filtering的缩写;传统算法里,在shadow map里面采样出来的值和depth value进行比较的时候二者是一一对应的,在PCF算法中,可以对shadow map的周边进行采样,然后都和depth value进行比较,比如采样shadow map4次,每确定这次采样处于阴影中就为最终计算的值累计0.25,这样最终得到的值的可能性是0.0,0.25,0.50,0.75,1.0,该值用于与阴影颜色相乘,以此来决定该pixel处于阴影的程度,实现软阴影效果。

时间: 2024-12-29 01:22:40

《CSM and PCF》的相关文章

读书笔记——《黑客大曝光》(5/8)

第3部分 基础设施攻击 将无线网卡设置为“监听”状态,能够识别哪个无线网络处于激活状态.借助“aircrack-ng”——一个无线网络监听工具包,能够截获802.11无线网络原始传输数据,尤其擅长截获WEP初始化向量,从而破解WEP密钥. 第7章 远程连接和VoIP攻击 1.公共交换电话网络存在一个连接到关键设备的调制解调器,作为进入系统的后门. 2.拨号连接入侵的方式采用与其他类型的入侵相类似的方式展开:踩点.扫描.查点.漏洞发掘. 常用工具:Tonel oc和THC-Scan.WarVOX(

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {

《高可用MySQL》1 – Windows环境下压缩版MySQL安装

近日在读O'REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容. Master-Slave这东西吧.在很多公司都是标配.开发中基本天天都用.遇到的问题自然也不少(如主从不同步,Master宕机).但操作权限很有限.有些东西,仅仅有自己看了.做了,才干真正知道原理是什么,也才干更好的去把握. 本文是高可用MySQL的第一篇读书笔记,主要记录Windows环境下压缩版MySQL(基于安装版的傻瓜式安装过程这里不再提及)的安装过程. 1. 从

《C#图解教程》读书笔记之三:方法

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.方法那些事儿 (1)方法的结构:方法头-指定方法的特征,方法体-可执行代码的语句序列: (2)方法的调用:参数.值参数.引用参数.输出参数.参数数组: ①参数: 形参-本地变量,声明在参数列表中:形参的值在代码开始之前被初始化: 实参-实参的值用于初始化形参: ②值参数: 为形参在栈上分配内存,将实参的值复制到形参: ③引用参数: 不为形参在栈上分配内存,形参的参数名作为实参变量的别名指向同一位置,必须使用ref关

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

20145336张子扬 《信息安全系统设计基础》第7周学习总结

20145336张子扬 <信息安全系统设计基础>第1周学习总结 教材学习内容总结 学习目标: 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部性原理和缓存思想在存储层次结构中的应用 高速缓存的原理和应用 三种常见存储技术:RAM.ROM和磁盘 随机访问存储器RAM分为静态RAM(SRAM)和动态RAM(DRAM) SRAM 用来作为高速缓存储存器,SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的.它可以无限制地保

20145317《信息安全系统设计基础》第六周学习总结(1)

20145317<信息安全系统设计基础>第六周学习总结(1) 第四章 处理器体系结构 指令体系结构:一个处理器支持的指令和指令的字节级编码 4.1Y86指令集体系结构 Y86:包括定义各种状态元素.指令集和它们的编码.一组编程规范和异常事件处理. Y86程序中的每条指令都会读取或修改处理器状态的某些部分.Y86具体包括:8个程序寄存器.3个条件码ZF\SF\OF.程序计数器(PC) Y86用虚拟地址引用存储器位置. 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态. 注意:条件

20145239 《信息安全系统设计基础》第5周学习总结

20145239<信息安全系统设计基础>第5周学习总结 教材学习内容 x86寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全 8086的分段模式 IA32的带保护模式的平坦模式 机器级编程的两种抽象 -ISA(Instruction set architecture).ISA简单来说就是指令集体系结构.定义了处理机状态,指令格式以及指令对状态的影响.-机器级使用的存储器地址是虚拟地址. 机器代码中的处理机状态 程序计数器(PC)表示将要执行的下一条指令在存储器中的地址. 整数

20145216史婧瑶《信息安全系统设计基础》第3周学习总结

20145216史婧瑶<信息安全系统设计基础>第3周学习总结 教材学习内容总结 十六进制表示法C表示法以0x或0X开头的数字常量为十六进制进制转换常用进制:二进制(B),十进制(D),八进制(O或者Q),十六进制(H) 转换为二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字. 同理,二进制与八进制的转化是三位对应一位. 但是通常情况下,进制转换都以二进制为桥梁进行转换. 对于一个字长为w位的机器来说,虚拟地址的范围是0~2^w-1.程序最多访问2的w次方个字节. 数据大小: 在