当前位置:网站首页>【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,继续加油吧!
边栏推荐
- If capturable=False, state_steps should not be CUDA tensors
- 软件测试面试题:系统测试的策略有?
- Software Testing Interview Questions: What aspects should be considered when designing test cases, i.e. what aspects should different test cases test against?
- 软件测试面试题:测试生命周期,测试过程分为几个阶段,以及各阶段的含义及使用的方法?
- 2022牛客多校第三场 J题 Journey
- After the staged testing is complete, have you performed defect analysis?
- GCC: paths to header and library files
- 码率vs.分辨率,哪一个更重要?
- E - Many Operations (bitwise consideration + dp thought to record the result after the operation
- Software Testing Interview Questions: What's the Key to a Good Test Plan?
猜你喜欢
TinyMCE disable escape
MongoDB搭建及基础操作
创意代码表白
2022 Hangzhou Electric Power Multi-School Session 3 K Question Taxi
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionExcep
数仓4.0(三)------数据仓库系统
LiveVideoStackCon 2022 上海站明日开幕!
B站7月榜单丨飞瓜数据B站UP主排行榜发布!
4. PCIe 接口时序
JUC线程池(一): FutureTask使用
随机推荐
After the staged testing is complete, have you performed defect analysis?
torch.autograd.grad finds the second derivative
Software testing interview questions: What are the strategies for system testing?
软件测试面试题:软件测试类型都有哪些?
[idea] idea configures sql formatting
Redis visual management software Redis Desktop Manager2022
软件测试面试题:测试生命周期,测试过程分为几个阶段,以及各阶段的含义及使用的方法?
OPENWIFI实践1:下载并编译SDRPi的HDL源码
Knowledge Points for Network Planning Designers' Morning Questions in November 2021 (Part 1)
2022杭电多校第三场 K题 Taxi
ORA-00257
Creative code confession
配置类总结
"No title"
JUC线程池(一): FutureTask使用
软件测试面试题:手工测试与自动测试有哪些区别?
软件测试面试题:您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程?
Helm Chart
2022杭电多校第一场 1004 Ball
金九银十面试跳槽季;你准备好了吗?