当前位置:网站首页>【TA-霜狼_may-《百人计划》】图形4.3 实时阴影介绍
【TA-霜狼_may-《百人计划》】图形4.3 实时阴影介绍
2022-08-05 00:50:00 【zczplus】
4.3.1 基于图片实时阴影技术
其中的图片意为:将阴影渲染成图片
平面投影阴影
- 根据光的方向,把物体的每个顶点投影到平面地面上。
- 数学原理:相似三角形
- 缺点:
- 只能投影到平面;
- 投影物体必须在光线和平面之间;

投影阴影
- 为每个阴影投影体设置一个相机
- 把阴影投影体渲染到阴影纹理中
- 渲染阴影接收者,并且与阴影纹理进行混合

Unity中的实现
- Projector组件:
- 可以设置它的参数生成一个视锥体
- Projector会使用提供给它的材质,绘制所有在视锥体内的物体
- 使用Render Texture生成阴影映射图,把阴影投影体绘制到阴影纹理中
- 给Project设置物体和阴影映射图混合的材质
阴影映射

右侧即深度图,黑色为靠近,白色为原理
- 首先获得光照位置的深度图
- 在视角位置对每个像素点进行处理
- 将当前位置的坐标转换到由光照位置得到的深度图中并比较大小
- 若比之前的深度值更大,说明距离光源越远,说明被遮挡,从而形成阴影

第三步就是上述说到的对比比较的过程;
4.3.2 实时阴影优化
阴影映射问题 – 自阴影
由于阴影映射的分辨率有限,离散的采样点以及数值上的偏差可能造成不正确的阴影效果。这就是自阴影,也被称为Z-Fighting或者阴影粉刺(Surface Acne)
解决方法:当比较深度时,为了避免表面自阴影,需要设置容错阈值:
- 深度偏移(Depth Bias)
- 法线偏移(Normal Bias)
但是如果深度便宜设置过大时,会导致漏光现象。即阴影与投影者之间发生脱节,也叫做Peter Panning问题。
偏移优化
下图左半边解释的很详细,
采样过程中选取的点可能是红色的点,作为阴影映射中的纹素深度,但是在View采样时的深蓝色点明明对应的是同一段线段,但是相较而言深度更深了,所以会被当做阴影。解决办法就是施加一个偏移,尽量正确的反应前后关系。
Unity中的偏移优化
- Shadow Caster 阶段基于顶点的Normal Bias;
- 在Shadow Caster阶段, 让遮蔽物进行反向偏移;
优点:性能高
阴影映射问题 ——走样
从信号重建的过程来审视阴影映射:
- 初始采样:渲染阴影映射;
- 重采样:从摄像机视角对采样信号(阴影映射)重采样;
两个阶段都会发生走样问题。
- 阴影映射在世界空间均匀分配;
- 视锥体内物体经过透视投影后,近大远小,近平面和远平面的像素一样;
- 靠近观察者的元素所用到的采样点明显变少;
- 这种误差被称为透视走样;

级联阴影映射(Cascaded Shadow Map)
透视走样最有效的解决方案;
把视锥体分割为多个子视锥体;
为每个子视锥体计算独立的相等大小的阴影映射;
其中的shadow distance自定义了产生阴影的范围(原本是从近平面到远平面),减少了部分开销;
重采样误差
映射纹理是一张动态生成的纹理;
滤波 —— 纹理采样误差的解决方案;
滤波
- 图像处理中,通过滤波强调一些特征或者去除图像中一些不需要的部分;
- 滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最后在那个的输出值;
阴影的滤波
- 使用一部分阴影映射采样点来计算某个指定View采样点的最终阴影结果的方法。
PCF滤波
- 从光方向生成阴影映射;
- 从摄像机视角进行深度测试;
- 当该着色点通过深度测试时,取该像素周围指定大小(滤波核)的范围。计算他们的可见平均值作为输出。

blocked代表周围像素不可见有42个,visible代表周围像素可见有7个,最终计算得到其阴影值
PCF滤波的不同实现
- 采样数K
- 规则滤波,33 或者 55;
- 采用Poisson Disk的形式来分布一定数量的采样点。
- 滤波核哈数
- 高斯函数作为滤波函数等;
作业
实时阴影的优化方案
- 针对自阴影问题利用深度偏移或者法线偏移进行调整;
- 针对走样问题利用级联映射方法对结果进行优化;
- 针对采样问题利用PCF滤波进行优化,达到更好的软阴影效果;
- 利用PCSS(Percetage closer soft shadows)进行软阴影实现;
- 针对PCSS又有了优化的VSSM(Variance Soft Shadow Mapping)
- 由于VSSM假设约束条件太多,出现了MSM(Moment shadow mapping 矩阵阴影映射)
还有好多好多好多好多要学呢!Games101后半部分+202,继续加油吧!
边栏推荐
- leetcode: 269. The Martian Dictionary
- ORA-00257
- 2022杭电多校第三场 K题 Taxi
- Lattice PCIe Learning 1
- Binary tree [full solution] (C language)
- ORA-00257
- 2022多校第二场 K题 Link with Bracket Sequence I
- 软件测试面试题:您如何看待软件过程改进?在您曾经工作过的企业中,是否有一些需要改进的东西呢?您期望的理想的测试人员的工作环境是怎样的?
- OPENWIFI实践1:下载并编译SDRPi的HDL源码
- Interview summary: Why do interviewers in large factories always ask about the underlying principles of Framework?
猜你喜欢

创意代码表白

5.PCIe官方示例

ORA-01105 ORA-03175

could not build server_names_hash, you should increase server_names_hash_bucket_size: 32

OPENWIFI实践1:下载并编译SDRPi的HDL源码

阶段性测试完成后,你进行缺陷分析了么?

Countdown to 1 day!From August 2nd to 4th, I will talk with you about open source and employment!

活动推荐 | 快手StreamLake品牌发布会,8月10日一起见证!

【FreeRTOS】FreeRTOS与stm32内置堆栈的占用情况

深度学习训练前快速批量修改数据集中的图片名
随机推荐
软件测试面试题:设计测试用例时应该考虑哪些方面,即不同的测试用例针对那些方面进行测试?
数仓4.0(三)------数据仓库系统
[230] Execute command error after connecting to Redis MISCONF Redis is configured to save RDB snapshots
More than 2022 cattle school training topic Link with the second L Level Editor I
Creative code confession
Getting Started with Kubernetes Networking
If capturable=False, state_steps should not be CUDA tensors
Software test interview questions: BIOS, Fat, IDE, Sata, SCSI, Ntfs windows NT?
Software testing interview questions: What are the strategies for system testing?
CNI (Container Network Plugin)
ORA-00257
ORA-00257
GCC:编译时库路径和运行时库路径
2021年11月网络规划设计师上午题知识点(下)
oracle create tablespace
2022 Hangzhou Electric Power Multi-School Session 3 Question B Boss Rush
2022 Nioke Multi-School Training Session H Question H Take the Elevator
活动推荐 | 快手StreamLake品牌发布会,8月10日一起见证!
配置类总结
Kubernetes 网络入门