4.3 实时阴影

一、基于图像的阴影技术(Shadow Map)

什么是阴影

当来自光源的至少一个点在空间中被遮挡时,就产生了阴影区域。

阴影的前提

  • 直接光照
  • 不透明物体

阴影的实现方式

阴影体(Shadow Volumes)——空间中黑暗部分的几何

阴影映射(Shadow Map)——在场景中没有背光源找到的地方

阴影映射(Shadow Map)

绿色的点没有阴影。

红色点在摄像机视角看是在阴影里,但在光源的视角看在盒子后面,不代表一定在阴影中(例如多光源情况)。

深度比较

相机视角渲染的深度图与光照视角渲染的深度图进行比较。

阴影映射-问题

  • 低分辨率的阴影映射会导致有锯齿的阴影。
  • 当比较深度时,为了避免表面自阴影,需要设置容错阈值(深度偏移)。

二、基于图像的阴影技术的优化

深度偏移(Depth Bias)

传统Shadow Map因为自阴影出现的问题——阴影失真(Shadow Acne)

红色斜着的区域对应了ShadowMap上每块片段(像素)的位置,因为阴影贴图受限于分辨率,在距离光源比较远的情况下,多个片段可能从ShadowMap的同一个值中去采样。图片每个斜坡代表ShadowMap一个单独的纹理像素。你可以看到,多个片段从同一个深度值进行采样。有些在地板上面,有些在地板下面;在和屏幕空间深度做比较的时候就会出现误差,这样我们所得到的阴影就有了差异。

我们可以用一个叫做阴影偏移(shadow bias)的技巧来解决这个问题,我们简单的对表面的深度(或深度贴图)应用一个偏移量,这样片段就不会被错误地认为在表面之下了。

举个栗子:

这四个fragment分别取名a,b,c,d,由于光源的位置会导致求得的四个距离会不一样,先求a到光源的距离假设为9.8<10,b到光源的距离是11.6 >10,c到光源的距离12.1>10,c到光源的距离9.5<10,。就会导致a和d亮,b和c暗,他们本来应该都是亮的才对。然后整个光源视椎体下各个片段都会出现这个问题,就会出现上面的明暗交错的条纹。








 

如果Bias值过大也会导致一个问题——悬浮

Unity中的自阴影优化

与OpenGL优化原理差不多。

阴影映射的走样

人们期望,正常情况下Shadow Map上的像素可以对应上屏幕空间的像素,这种情况仅在目标Light垂直于目标物体(平面)时才会出现,但通常并不会满足上述条件。

因此人们开始针对此类问题进行优化,主要优化点如下:

  • 初始采样(渲染阴影映射)
  • 重采样:从摄像机视角对采样信号(阴影映射)重采样
  • 重建:使用滤波函数(例如PCF)

主要误差类型

解决方案:

  • 初始采样——透视走样
  • 光空间透视阴影映射 (LiSPSM)
  • Z分割(级联阴影映射)
  • 视口采样映射

小结

  • 只能使用一张阴影映射时,LiSPSM是最好的选择,尤其是户外顶部光照
  • 允许多张阴影映射时,最好的方案是Z分割(CSM等)
  • 自分割可以同时处理透视与投影走样,RMSM与现值虚拟纹理的方案很类似,支持虚拟纹理的引擎很容易实现
  • 无走样方案可以达到像素级别的精度,应该会是未来的趋势

硬阴影的滤波

  • 主要用于减少重采样的误差(使用阴影映射进行渲染时产生)
  • 滤波
    • 图像处理中可以通过滤波强调一些特征或者去除图像中一些不需要的部分
    • 滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值
    • 任何使用一部分阴影映射采样点来计算某个指定View采样点的最终阴影结果的方法
PCF(Pencentage close Filtering)滤波

  • 可以模糊来隐藏欠采样的瑕疵;
  • 得到类似软阴影的效果,不少游戏引擎称之为“软阴影”;
  • 一个重要缺陷是较大的滤波核会导致更多采样点的计算,性能消耗大;
  • 无法进行预计算,因为滤波依赖于
  • PCF 虽然能对阴影进行平滑模糊,但毕竟无法模拟基于物理的软阴影, PCSS(Percentage Closer Soft Shadows)能够设置变化的滤波核来改进这一点。

三、基于图片的软阴影算法

流程:

1.查找遮挡体

2.半影宽度的计算

Wpenumbra=P sz- Zavg / Zavg * Wlight

Wlight为光源的大小

3.滤波

Wf = Znear / PSZ *Wpernumbra

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot集成swagger之knife4j

knife4j的最终效果&#xff1a; 支持直观的入参介绍、在线调试及离线各种API文档下载。 1 引入pom <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</ver…

python 3.7安装并配置 pytorch(torch 1.8.2 + cuda 11.1 + torchaudio 0.8.2 + torchvision 0.9.2)

文章目录 前言一、安装 python二、安装 cuda cudnn二、安装 pytorch2.1 版本匹配2.1.1 方法一2.1.2 方法二2.2 安装 .tar.bz2 三、验证是否安装成功总结 前言 本篇文章主要介绍在Windows下 python 3.7 配置 pytorch&#xff0c;帮助需要的朋友避坑 安装 pytorch 需要多个版本适…

内建组件和模块

讨论 Vue.js 中几个非常重要的内建组件和模块&#xff0c;例如 KeepAlive 组件、Teleport 组件、Transition 组件等&#xff0c;它们都需要渲染器级别的底层支持。另外&#xff0c;这些内建组件所带来的能力&#xff0c;对开发者而言非常重要且实用&#xff0c;理解它们的工作原…

Word中如何实现 图片 | 表格 自动编号与文中引用编号对应

当我们在进行大篇幅word文档的编写时&#xff0c;为了节约修改文章中图片或表格所花费的大量时间&#xff0c;可以将图片自动编号&#xff0c;且让文中引用的顺序跟着图片顺序的变化而变化&#xff0c;具体操作如下&#xff1a; 1. 将鼠标定位在图片或者表格欲加编号的下方或上…

Banana Pi [BPi-R3-Mini] 回顾和主线 ImmortalWrt 固件支持

BananaPi BPi-R3 Mini 采用 MediaTek 830&#xff08;4 个 A53&#xff0c;最高 2.0 GHz&#xff09;&#xff0c;具有 2 个 2.5 GbE、AX4200 2.4G/5G 无线和 USB 2.0 端口。它还具有两个 M.2 连接器&#xff0c;可用于 NVMe SSD 和 5G 模块&#xff08;板上包含 Nano SIM 插槽…

ELK企业级日志分析平台——kibana数据可视化

部署 新建虚拟机server5&#xff0c;部署kibana [rootelk5 ~]# rpm -ivh kibana-7.6.1-x86_64.rpm [rootelk5 ~]# cd /etc/kibana/[rootelk5 kibana]# vim kibana.ymlserver.host: "0.0.0.0"elasticsearch.hosts: ["http://192.168.56.11:9200"]i18n.local…

微服务学习(十二):安装Minio

微服务学习&#xff08;十二&#xff09;&#xff1a;安装Minio 一、简介 MinIO 是一款基于Go语言发开的高性能、分布式的对象存储系统。客户端支持Java,Net,Python,Javacript, Golang语言。MinIO系统&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视…

Qt 软件开发框架(主要部分)

目录 1、 一个软件基本要素 &#xff08;1&#xff09;UI模块 &#xff08;2&#xff09;网络模块 &#xff08;3&#xff09;业务逻辑模块 &#xff08;4&#xff09;中间层 &#xff08;5&#xff09;独立模块&#xff08;守护进程、更新模块、日志收集模块…&#xff…

【spring(三)】AOP总结

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、AOP相关概念 ① AOP核心思想思想&#xff1a; ② AOP专业术语&#xff1a; 二、AOP快速如入门 三、AOP工作流程 四、切入点表达式 ① 语法格式 ②支持通配符 ③书写技巧 五、通知类型 ①⭐环绕通知…

nodejs 如何将 Buffer 数据转为 String

问题说明 使用webSocket的时候出现了一个问题&#xff0c;前端小程序和nodejs后端建立websocket连接后&#xff0c;使用send方法发送到后端为buffer格式&#xff0c;以下为我前后端代码 1、前端小程序代码 //创建webSocket连接 const socket uni.connectSocket({url: wss…

[架构之路-249]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:如何用图形表达需求,结构化方法的需求分析

目录 一、概述 二、数据模型&#xff1a;E-R图/实体关系图&#xff08;数据单元之间的结构关系&#xff09; 三、功能模型&#xff1a;数据流图DFD&#xff08;逻辑运算&#xff0c;包括输入和输出&#xff0c;实体之间的关系&#xff09;&#xff1a;输入》处理 》 输出 四…

【VSCode】VSCode 使用

目录 文章目录 目录插件配置设置代码不显示 git 提示 "xxx months ago | 1 author"设置打开项目不自动选择 CMakeLists 插件 以下插件为 C 开发偏好设置。 C/CCMakeCMake ToolsGitLensRemote DevelopmentRemote Explorer 配置 设置代码不显示 git 提示 “xxx mon…

绝地求生:PGC 2023 赛事直播期间最高可获:2000万G-Coins,你还不来吗?

今年PGC直播期间将有最高2000万G-Coin掉落&#xff0c;究竟花落谁家咱们拭目以待 公告原文&#xff1a;Watch PGC 2023 Live And Earn G-Coins! 如何赚取高额G-Coin&#xff1f; Throughout the PGC 2023, an astounding 20,000,000 G-Coins will be up for grabs as part of …

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写&#xff0c;图文并茂&#xff0c;篇幅较长&#xff0c;欢迎阅读完提供宝贵的建议&#xff0c;一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接&#xff1a; 《一文彻底读懂一致性Hash 算法》 通过阅读本…

【OpenCV实现图像:可视化目标检测框】

文章目录 概要画框函数代码实现标签美化角点美化透明效果小结 概要 目标检测框的可视化在计算机视觉和机器学习领域中是一项重要的任务&#xff0c;有助于直观地理解和评估目标检测算法的性能。通过使用Python和相关的图像处理库&#xff0c;可以轻松实现目标检测框的可视化。…

Let’s xrOS 一款让你优先体验社区创作者的 visionOS App工具

Let’s xrOS Apple Vision Pro 发布预示着空间计算时代的到来&#xff0c;让科技爱好者和开发者开始思考如何在新的交互、系统和硬件上打造独特的三维应用。 自 WWDC 2023 的发布会后&#xff0c;社交媒体上涌现了许多精美的 visionOS App 的效果图和演示视频&#xff0c;然而…

Rola详解国外住宅IP代理选择的8个方法,稳定的海外IP哪个靠谱?

一、国外住宅IP代理是什么&#xff1f; 代理服务器充当您和互联网之间的网关。它是一个中间服务器&#xff0c;将最终用户与他们浏览的网站分开。如果您使用国外代理IP&#xff0c;互联网流量将通过国外代理服务器流向您请求的地址。然后&#xff0c;请求通过同一个代理服务器…

常见树种(贵州省):014槭树、梧桐、鹅掌楸、檫木、梓木、油桐、泡桐、川楝、麻楝

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、色木槭…

java--继承快速入门

1.什么是继承 java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类和另一个类建立其父子关系。 2.继承的特点 子类能继承父类的非私有成员(成员变量&#xff0c;成员方法)。 3.继承后对象的创建 子类的对象是由子类、父类共同完成的。 4.继承的…

基于IDEA+HTML+SpringBoot前后端分离电子商城

基于springboot的电子商城 项目介绍&#x1f481;&#x1f3fb; •B2C 商家对客户 •C2B2C 客户对商家对客户 1.1.1 B2C 平台运营方即商品的卖家 小米商城 •商品 •用户 1.1.2 C2B2C 平台运营方不卖商品&#xff08;也可以卖&#xff09; 卖家是平台的用户 买家也是平台用户 •…