GAMES202-Shadow总结概括


截图均来自于闫令琪老师的GMAES202-Shadow,本文在于对课程内容进行总结以及加上自己的理解,希望帮助同学们加深对课程内容的理解,如有谬误请各位指正


复习本节需要的基本知识

1. Shadow Mapping

为了获得一张Shadow Mapping,需要我们对场景进行两次渲染

第一次渲染时,将摄像机放置于光源处,用depth test获得一幅带有深度值的纹理
第二次渲染时,将摄像机放置原处,再次记录看到的点到光源的距离

将第二次得到的值与第一次得到的深度值进行比较,如果大于第一次的深度值则说明该点在阴影中,如果等于则说明不在阴影中




2. Mipmap

多级渐远纹理(Mipmap)本质上是根据距离选择不同的纹理(但不是LOD)
Mipmap原理类似于基于距离的线性纹理过滤(Opengl中分为线性过滤与邻近过滤)
线性过滤可以理解为对周围像素进行加权插值,得到的是一个平均颜色
邻近过滤可以理解为选择最近的一个像素颜色

Mipmap可以避免远距离采样频率低和数据频率高造成的摩尔纹或者失真,同时具有良好的性能。


本节内容


1. 自遮挡现象




Shadow map上面记录的是一格一格像素的不连续的深度值,而如上图中,shadow map连出的蓝色的线本应该记录红色部分的深度值,而被黄色部分遮挡住了,造成了显示的错误

如果光源从头顶向下直射则不会造成自遮挡现象
如果光源从左边或者右边射入则会造成更为严重的的自遮挡现象

那么如何解决这个问题呢?




可以增加一段偏移值,即图上黄色的部分,在偏移值内部的遮挡可以忽略不计,这个bias不是一个固定值,可以根据光源到地面的角度来进行改变,例如如果光源从上往下直射地面,这时自遮挡现象不明显,则可以减小bias的值

但是同时偏移值的加入也带来了阴影丢失的问题(有时候bias太大反而会把正确的阴影去除掉)
在工业界通过调整最合适的bias值可以大致解决此问题
在学术界通过Second-depth shadow mapping方法
即记录最小深度于与第二小深度再对两者进行平均,使用中间的深度做阴影比较


2.PCF(Percentage Closer Filtering)

在绘制ShadowMapping时我们会遇到明显的硬阴影(图上)
而在现实生活中我们更常见到的是软阴影(图下)


为了让显示效果更加符合实际 我们则需要PCF对阴影进行过滤(在阴影判断阶段)

上图为一张ShadowMapping,我们选取p点为例,对p点周围的像素进行采样,例如为3✖️3的每一格的深度值都与shading point进行比较(即判断是否被遮挡),得出一组为3✖️3的值为0或1的表(比较得出的结果非0即1),然后对这些01值进行加权平均(即滤波操作),最终得到一个visibility的值(大于0小于1)


3. PCSS(Percentage Closer Soft Shadows)

在现实生活中我们常碰到一种现象:在树🌲的到树根部分的阴影更深,而在树叶部分的阴影更浅,为了实现这种效果,我们使用了PCSS方法,即根据遮挡物的距离来对阴影的软硬程度进行调节


w P e n u m b r a = ( d R e c e i v e r − d B l o c k e r ) ⋅ w L i g h t / d B l o c k e r w_{Penumbra}=(d_{Receiver}-d_{Blocker} )\cdot w_{Light}/d_{Blocker} wPenumbra=(dReceiverdBlocker)wLight/dBlocker

上述公式是 由上图两个黄色三角形相似推导得出

w用来表示阴影的软硬程度
而为了得到w的值,必须要知道blocker的depth,将每一个点得到的depth进行均值操作得到的average blocker depth即是我们要的深度值。


PCSS的全部操作可以概括为:

  1. 计算平均blocker深度
  2. 计算w值
  3. 使用PCF

缺点:

  1. 第一步和第三步比较慢(因为需要大量的采样,阴影越软,采样范围越大)
  2. 采样则会产生噪声,造成得到的visivility图上会有很多噪声

4. VSSM(Variance Soft Shadow Mapping)

VSSM则是对第一步和第三步采样慢的一个解决思路
第三步PCF的本质是加权平均比较得出的01值,即可近似看作,有百分之多少的texel的深度比shading point的深度浅


于是我们可以把采样的问题转化成从直方图📊或正态分布上找大概所占的百分比

那么如何得到正态分布呢?
在概率论中我们可以通过期望方差来得到某个模型的正态分布

期望(即均值)我们可以通过MipMap来得到,但MipMap只能得到正方形的
为了得到矩形的均值我们使用SAT(Summed Area Tables)方法

方差我们可以通过下面这个公式, 即方差=平方的期望-期望的平方

V a r ( X ) = E ( X 2 ) − E 2 ( X ) Var(X)=E(X^2)-E^2(X) Var(X)=E(X2)E2(X)

我们则需要两张Shadow Map一张记录深度一张记录深度的平方

(tips:在OpenGL中将两张深度值写入RGB的两个通道即可,不需要一个额外的纹理)

通过得到的方差和均值我们可以计算正态分布,接着只需要知道阴影部分的面积即可得到百分比,计算面积时可以使用误差函数对正态分布的数值解进行打表并储存,当需要使用的时候调用即可



但大佬们发现了更加简便的方法——通过切比雪夫不等式来解决这个问题

P ( x > t ) ⩽ σ 2 σ 2 + ( t − μ ) 2 P(x>t)\leqslant\frac{\sigma^2}{\sigma^2+(t-\mu)^2} P(x>t)σ2+(tμ)2σ2

μ \mu μ为期望 σ 2 \sigma^2 σ2为方差
如图为通过切比雪夫不等式计算得到的面积(红色阴影),即我们所需要的百分比值


在实时渲染中为了得出近似的效果可以直接把不等式作为值的估计

(切比雪夫不等式有一个限制是t必须在 μ \mu μ的左面,否则会造成估计不准确)


刚刚说到第一步和第三步的采样都对系统性能有影响,现在我们解决了第三步的采样问题,那如何解决第一步呢

第一步是为了计算遮挡物的平均深度
如下图
假设shading point对应的深度为7
蓝色的值<7,则蓝色为遮挡物的深度



我们定义
Blocker (z<t),avg. z o c c z_{occ} zocc
Unblocker (z>t), avg. z u n o c c z_{unocc} zunocc
z a v g z_{avg} zavg则是对这些数加起来的平均

则有

N 1 N z u n o c c + N 2 N z o c c = z a v g \frac{N_1}{N}z_{unocc}+\frac{N_2}{N}z_{occ}=z_{avg} NN1zunocc+NN2zocc=zavg

我们可以利用上面提到的切比雪夫不等式
N1/N = P(x>t)
N2/N=1-P(x>t)
同时近似非遮挡物的深度等于shading point的深度,即 z u n o c c = t z_{unocc}=t zunocc=t

这时除了 z o c c z_{occ} zocc遮挡物深度我们所有的值都已经计算出来了,结果显而易见解一个一元一次等式即可得到

如此一来PCSS第一步和第三步的采样问题通过VSSM转换成了性能消耗更低的做法


5. SAT for Range Query

上面说到通过SAT方法来计算均值
而计算均值本质上就是范围内求和然后除以元素个数
我们则可以引用前缀和这一概念
即红色数据的值为当前位置之前每一项蓝色的和





那么要计算某一段的和例如图中的sum则可以通过前六个数的和20减去前三个数的和9得到

在二维情况下


在这里插入图片描述


要得到蓝色格子内的值则需要用绿色格子减去横竖两个黄色格子的值,因为重复剪掉了左上角的值则需要再加上左上角绿色格子的值

我们可以建立一张表,每一行从左上角加到某个元素的值,再对每一列做相同操作
复杂度为O(m x n)
同时每一行都是并行计算的,则可以通过GPU比较快的完成表的建立


6. Moment Shadow Mapping

VSSM尽管十分巧妙,但也存在一些问题

如下图正态分布可能造成阴影漏光的问题





为了让分布更加准确我们可以使用更高阶的矩来描述分布
即类似于泰勒展开于傅立叶展开,记录多少次方就是保留前多少阶的矩
下图展示了不同阶矩对分布的影响





通过使用四阶的矩我们就近似的解决了分布不准确,即阴影漏光的问题

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

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

相关文章

暗黑破坏神:不朽 unity mmo arpg资源分包精讲

unity大型游戏资源管理——分包 视频讲解&#xff1a;点击观看 unity mmo arpg 暗黑破坏神&#xff1a;不朽 是一个大型的重度游戏&#xff0c;该游戏资源已经超过10G 所以它用了资源分包技术减少下载时间。 首包只包含基础资源&#xff0c;在玩家玩第一关的时候&#xff0c;后…

股票卖出技巧及原则,你了解哪些

股票卖出技巧及原则&#xff0c;你了解哪些&#xff1f;有句股谚说&#xff0c;“会买的是徒弟&#xff0c;会卖的是师傅&#xff0c;会空仓的是祖师爷”。以前都是把大部分精力放在了选股和如何买股上面&#xff0c;而对如何卖股票太忽视了。难怪总是出不了师&#xff0c;小学…

通达信破底翻选股公式,用缠论底分型进行优化

上次在写《通达信破底翻形态选股公式&#xff0c;选出破底之后再翻回的股票》这篇文章时&#xff0c;编写破底翻选股公式就考虑使用缠论底分型&#xff0c;但是底分型的包含关系较为复杂&#xff0c;不容易处理&#xff0c;只能暂时搁置&#xff0c;采用了一种简单的方式&#…

股票大作手操盘术[图解]

目录 第一章&#xff1a;投机是一项挑战 第二章 何时入场才是好时机 第三章 追随领头羊 第四章 手里的钱财 第五章 关键点 第六章 百万美元的大错 第七章 三百万美元的盈利 第八章 利弗莫尔市场要决 杰西•利弗莫尔为什么能在投机事业中取得巨大成功&#xff0c;这…

【通达信指标公式】主力博弈分时指标,分时图抓日内弱转强牛股

GHYJKU:BETWEEN((CLOSE*1)/(SUM(AMOUNT,BARSCOUNT((CLOSE*1)))/SUM(VOL*100,BARSCOUNT((CLOSE*1)))),1.05,0.95); VBNH:IF(GHYJKU0,MA((CLOSE*1),BARSCOUNT((CLOSE*1))),(SUM(AMOUNT,BARSCOUNT((CLOSE*1)))/SUM(VOL*100,BARSCOUNT((CLOSE*1))))); 紫色跟风:EXPMA((CLOSE/VBNH),…

ChatGPT写代码之——CodeWhisperer在VS Code下如何安装

一、安装 1. 在VS Code扩展中搜索AWS 点安装就安装好了 #二、配置 1. 点击状态栏出现的AWS 选择add New Connection 选择Use a personal email to sign up and sign in with AWS Builder ID 选择Copy Code for AWS builder ID 跳转到浏览器 2. 在浏览器上一步步用自己的邮…

计算机程序设计类论文,计算机编程论文

计算机编程论文 介绍:本栏目是计算机和编程和论文相关的论文例文,免费教你怎么写关于计算机编程的论文提供相关文献资料。 【摘 要】本探究经过问卷调查、现场采访、走访调查、查阅文献资料等方法对河南省各大高校计算机专业大学生的学习情况(特别是编程能力)进行了调查和研。 …

爱丁堡计算机专业硕士世界排名,爱丁堡大学计算机世界排名

导读&#xff1a;,伴随着科技与经济的高速发展&#xff0c;计算机技术专业成为一门热门的专业&#xff0c;越来越受到人们的欢迎&#xff0c;学校的师资力量和教育水平&#xff0c;也直接成为影响我们选择高校的原因之一。 伴随着科技与经济的高速发展&#xff0c;计算机技术专…

爱丁堡大学计算机专业alevel,爱丁堡大学alevel要求?

原标题&#xff1a;爱丁堡大学alevel要求&#xff1f; 爱丁堡大学接受A-level和国际文凭课程的直接申请&#xff0c;每个学位课程都必须达到特定标准的要求才能入学。例如&#xff1a;申请爱丁堡大学商学院本科课程A-level要求AAA-ABB&#xff0c;兽医学(5年制)A-level要求为AA…

革微信的命,要靠“聊天即挖矿”?

广告诱惑我们追求名车服饰,从事自己憎恨的工作,为的就是买堆根本没用的狗屁东西。 ——Tyler Durden,《搏击俱乐部》 2019年1月15日,注定是一个不平凡的日子,这一天,3家公司揭秘了酝酿已久的社交产品——分别是罗永浩的聊天宝,王欣的马桶MT,张一鸣的多闪。目的只有一个…

用AI重构骨架,打造未来感IP体验经济

我国网文市场目前拥有近2000万位作家、4.9亿名读者。 如果将庞大的网文行业比作一个江湖&#xff0c;那么拥有2.4亿月活用户的阅文集团&#xff08;HK00772&#xff0c;股价33.2港元&#xff0c;市值338.06亿港元&#xff09;&#xff0c;称得上是“天下第一大派”。 “第一大…

NLP-预训练模型-GPT系列:GPT-1(2018-06)、GPT-2(2019-02)、GPT-3(2020-05)、InstuctGPT(2022-01)、chatGPT(2022-11)

GPT1:Imporoving Language Understanding By Generative Pre-training GPT2:Lanuage Models Are Unsupervised Multitask Learners GPT3:Language Models Are Few-shot Learners GitHub:https://github.com/openai/gpt-3 从GPT三个版本的论文名也能看出各版本模型的重点…

后端学习路线(包含博主买的课程)(持续更新中...)

快速了解Java体系(尚硅谷雷神主讲): Java技术栈 前端学习路线 博主已购买此网站的永久会员&#xff0c;含有大量付费资源&#xff0c;需要的私聊&#xff1a; 666资源站-666资源站 学习建议&#xff1a; 开发过程中&#xff0c;建议结合ChatGPT开发&#xff0c;减少重复工作…

GPT全家桶再添一员!看论文神器,ResearchGPT,可立即试用

文&#xff5c;Pine 发自 凹非寺源&#xff5c;量子位 科研人员福音&#xff01;专门和论文对话的“ChatGPT”来了。 懒得看论文&#xff1f;没关系&#xff0c;直接让这个工具帮你看&#xff0c;有什么问题直接问它就好了。 而你全程要做的就只有上传论文和问问题。 但又感觉心…

副业是刚需?分享几个程序员接外包私活的网站

经常看到某某程序员接了个项目开发&#xff0c;工作之余轻轻松松赚了钱还顺带提升了技术&#xff1b;或者看到某大佬又发表了一篇程序员技术提升稿件&#xff0c;阅读点赞收藏三连发&#xff0c;这个月的零花钱又不愁了...但自己只是一名普普通通的程序员&#xff0c;能找到这样…

PostgreSQL 不能数据备份及恢复失败,提示postgresql Please correct the Binary Path in the Preferences dialog

备份或恢复提示&#xff1a; Please correct the Binary Path in the Preferences dialog. 看了一下路径&#xff0c;原因是路径不一样 解决方案 File - Preferences -Paths - Binary paths 改成&#xff1a;&#xff08;根据自己安装的位置&#xff0c;复制bin路径过去就…

微信备份聊天记录,显示连接错误,终极解决办法

微信备份聊天记录到电脑时&#xff0c;提示连接错误&#xff0c;网上找了各种办法&#xff0c;关闭防火墙&#xff0c;链接同一wifi&#xff0c;没有解决&#xff0c;有可能和我的路由器有关&#xff0c;如果大家遇到连接同一个路由器WiFi还是无法备份&#xff0c;可以尝试以下…

学术科研专用ChatGPT来了!Github上已斩获2w+ Star

来源&#xff1a;新智元 自从ChatGPT发布之后&#xff0c;各路大神都开始研究如何把它加入到自己的「科研工作流」当中。 比如「数学天才」陶哲轩就表示&#xff0c;他已经将ChatGPT纳入了自己的工作流程。 最近&#xff0c;一位网友也分享了自己的「ChatGPT 学术优化」项目。 …

使用 ChatGPT(简单)+ GitHub 存储库创建 C# 聊天机器人

在本指南中&#xff0c;我们将深入探讨使用 ChatGPT 和 C# 构建聊天机器人的过程。我们将涵盖从设置 ChatGPT API 访问到部署聊天机器人的所有内容。让我们开始吧&#xff01; 最后你会发现 GitHub Repo 设置您的 ChatGPT API 访问权限 在我们开始构建我们的聊天机器人之前&…

吴恩达提示工程实战演练 - 提示原则及其相关策略

ChatGPT爆火之后&#xff0c;与大语言模型对话能力&#xff08;prompt engineering&#xff1a;提示工程&#xff09;成为一项稀缺技能&#xff0c;现在招聘市场专业的prompt工程师年薪达到几十万甚至百万。基于此&#xff0c;吴恩达&#xff08;前百度首席科学家&#xff0c;谷…