GAMES202-高质量实时渲染(Real-Time Shadows)

目录

  • Shadow Mapping
    • shadowMapping的问题
    • shadow mapping背后的数学
    • PCF(Percentage Closer Filtering)
    • PCSS(Percentage closer soft shadows)
    • VSSM(Variance Soft Shadow Mapping)
      • 优化步骤3
      • 优化步骤1
      • SAT(Summed Area Tables)
      • VSSM的问题
    • Moment Shadow Mapping
    • Distance Field Soft Shadows

GitHub主页:https://github.com/sdpyy1
作业实现:https://github.com/sdpyy1/CppLearn/tree/main/games202

Shadow Mapping

这块东西在我OpenGL学习笔记中有详细介绍

https://blog.csdn.net/lzh804121985/article/details/147256140?spm=1001.2014.3001.5502

shadowMapping的问题

阴影痤疮(Shadow Acne)、或者叫自阴影
在这里插入图片描述
出现该问题的原因可以看下图,光源视角下的一个像素内高度认为是同一个,下一个像素的位置,会被认为比前一个Z值更远,所以平坦的地板会交替出现高低不平的地方,这样就会出现阴影
在这里插入图片描述
简单解决就是认为z插值在一个范围内就不算在阴影中,虽然能解决这个问题,但是引入了新的问题,阴影发生了偏移。如果bias设置的过大,在靠近脚的地方,就不会出现阴影。在工业界称为“彼得潘效应"(Peter Panning)
在这里插入图片描述
对于这种不接触的阴影,解决方法是shadowmapping中不仅存最小深度的表面,还存储第二小深度的表面
在这里插入图片描述
另外阴影还有走样问题,毕竟阴影计算就是一个像素一个像素来做的
在这里插入图片描述

shadow mapping背后的数学

在实时渲染中,经常会用到一些不等式,但人们更多关注的是不等式相等时成立的条件,也就是说,不等式在什么条件下近似相等。实时渲染中,经常用到的一个约等如下:
在这里插入图片描述
满足下列两个条件之一时,实时渲染领域认为他们近似相等:
当g(x)满足:

  1. g(x)积分域足够小
  2. g(x)足够smooth,g(x)值变化不大,比较平坦

下面来到渲染方程
在这里插入图片描述
根据上边的不等式,就可以把最后一项(V)提出来
在这里插入图片描述
这样变换后,渲染方程就变成了正常做shading之后,再乘以一个表示可见不可见的项
这时的G(x)就是渲染方程的被积函数

PCF(Percentage Closer Filtering)

以点P为例,并不只找shadowmap中对应的一个像素,而是找一圈的像素,与这些像素都进行比较,最后将比较结果进行平均
在这里插入图片描述
比较结果就是一个全是1,0的矩阵,最终得到的数就不是非0即1的数了
在这里插入图片描述
在这里插入图片描述

PCSS(Percentage closer soft shadows)

PCF它原本是用来解决阴影的走样问题的,后来人们又发现它可以用来生成软阴影,就是PCSS
首先来回顾一下软阴影和硬阴影
在这里插入图片描述
到这里就可以理解软阴影在阴影不同位置有不同的软硬程度就可以通过PCF的滤波核的大小来控制,越大越模糊,越小越硬
在这里插入图片描述
w(半影)与光源大小、物体位置之间呈现相似三角形的关系,w就可以用来表示软硬程度。半影举例越大,滤波核尺寸就应该设计的更大,让阴影更软

总结PCSS的算法流程:1. 在一个范围搜索遮挡物,并计算平均深度。2. 用平均深度求出半影距离3. 在对应的滤波核尺寸下进行PCF
在这里插入图片描述
上边的步骤1需要选取一个合适的范围,下图就展示了如何选取一个范围来进行遮挡物搜素,假设了ShadowMap在近平面,用光源的大小来决定搜素范围
在这里插入图片描述在这里插入图片描述
在PCSS第一步和第三步中,为了计算一个像素点的着色,需要考虑多个纹素,从而导致速度慢。如果采用稀疏采样,又会有噪点产生
请添加图片描述

VSSM(Variance Soft Shadow Mapping)

针对PCSS效率问题,提出VSSM

优化步骤3

PCF和PCSS的 PC(percentage closer)的理解就是在深度纹理的一片区域内,有多少比例的纹素比着色点深度小
请添加图片描述
这就相当于看多少人比我考试分数高,就需要遍历所有同学的成绩
VSSM的解决方案就是用成绩分布(正态分布)来估计(⚠️VSSM并没有用正态分布,这里这样说只是方便理解,后边提到切比雪夫不等式就好理解了)
请添加图片描述
定义一个正态分布需要均值和方差,这个可以快速计算请添加图片描述
均值可以通过mipmap(因为上一级map到下一级map就是把相邻的正方形进行平均,到最后就整合为了一个平均值)、SAT(是一种用于高效计算矩形区域内元素总和的数据结构)来求,方差则是用一个概率论公式来求
请添加图片描述
得到正态分布分布后,求小于着色点深度的纹素百分比,其实就是阴影部分的线下面积
请添加图片描述
下来VASS还对这种计算进行了简化。直接使用不等式来近似
只要给定均值、方差、和要比较的位置t,就有下面的不等式成立 ,在渲染中就直接用方差、期望、t来估计红色部分的面积,然后马上就能得出剩余部分的面积(t必须大于中间线才好使)
请添加图片描述
至此,对PCSS步骤三的优化结束,在生成shadowMap时,为了计算方差,还需要额外生成一张平方shadowMap,总体来说甚至都不需要进行loop就可以知道一片区域有多少纹素深度小于着色点深度
请添加图片描述

优化步骤1

为了设置合理大小的过滤核,对一个区域内遮挡物的深度进行平均,需要遍历纹素,效率并不高

例如下图,如果着色点的深度为7,那么这些纹素的深度只有蓝色的是遮挡物,就需要平均他们,而红色不参与计算
请添加图片描述
对蓝色部分和红色部分求均值后,满足下式
请添加图片描述
这里求N1/N就可以直接用刚才步骤三的不等式(用方差、均值、t来估计大于t的比例),之后1减去它就是N2/N。

但我们还不知道红色部分的均值,在VSSM中直接假设红色部分均值就是t(大胆的假设,假设的依据是阴影位置大概率是个平面)
请添加图片描述
VSSM的效果请添加图片描述
另外课程还提到目前PCSS是压过VSSM的,因为人们对噪声的容忍度越来越高,在图像层面进行降噪手段变强了

SAT(Summed Area Tables)

SAT是给一片区域立刻得到它的均值的一种数据结构

SAT是对原数据的预处理得到的数据,在一维场景下,每个index记录都是前缀和(提前记录好),现在要求中间某一段的和,就直接拿出SAT在范围查询边界(左边是边界-1)的数据相减就行了
请添加图片描述
在二维情况下蓝色的范围查询,可以转化为左上角都是(0,0)的框加减操作
请添加图片描述

VSSM的问题

VSSM中作了很多假设,有一个就是假设一片区域纹素是符合正态分布的
例如右图深度只有3个峰值,不符合正态分布
请添加图片描述
下图就是说本来只有一小部分没遮住,但是假设为正态分布变成了很大一部分,就会让阴影边白
请添加图片描述
有一些地方变白了
请添加图片描述

Moment Shadow Mapping

为了解决VSSM分布描述不准确的问题,提出MSM,使用更高阶矩来描述分布
请添加图片描述
请添加图片描述
大概意思就是用数据的高阶来更好的拟合PCF的效果,下图表明用4阶矩下的分布就很好的达到了PCF的效果
请添加图片描述
缺点很明显空间很大
请添加图片描述

Distance Field Soft Shadows

请添加图片描述
首先看一下Distance functions是什么,它描述了空间中任意一点到物体表面的最小距离,离得越远值越小,表示到图上就是变白
请添加图片描述
在任何一个点上,以它记录的值为半径画圆,都不可能碰到物体,如果做光线追踪,那可以直接移动到圆的表面上去,这就是SFD的一个应用
请添加图片描述
下来用它来生成软阴影是它的另外一个阴影
用SDF可以大概描述多大的范围被物体挡住了,圆圈内为安全距离,不会有物体挡住,用这个圈的大小来定义visbility的大小,从而实现软阴影
请添加图片描述
在不同的位置找圆做切线,最小的切线就是需要的安全距离
请添加图片描述
求角度是一个acrsin的计算,比较慢,人们用一个替代来简化
请添加图片描述
其中根据不同的k值来达到不同的效果
请添加图片描述
显而易见的优缺点 空间换时间,但这是不考虑生成距离场的时间
请添加图片描述

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

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

相关文章

iphonex uniapp textarea标签兼容性处理过程梳理

嗨,我是小路。今天主要和大家分享的主题是“iphonex uniapp textarea标签兼容性处理过程梳理”。 在uniapp项目中,经常会使用到uniapp原生的textarea标签,但在手机兼容性这块,textarea并不是很好用,会出现一些…

C++ 区分关键字和标识符

1. 关键字(Keywords) 定义:关键字是编程语言预定义的具有特定意义的单词。它们是语言的一部分,C编译器具有特殊的理解规则,不能作为用户自定义的标识符。作用:关键字用于定义语言结构,如声明变…

杭电oj(1087、1203、1003)题解

DP 即动态规划(Dynamic Programming),是一种通过把原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而解决复杂问题的算法策略。以下从几个方面简述动态规划: 基本思想 动态规划的核心在…

一键多环境构建——用 Hvigor 玩转 HarmonyOS Next

引言 在 HarmonyOS Next 的应用开发中,常常需要针对不同环境(测试、预发、线上)或不同签名(调试、正式)输出多个 APP/HAP 包。虽然 HarmonyOS 提供了多目标构建(Multi-Target Build)能力&#…

qt/c++云对象浏览器

简介 本项目为基于QT5和C11的云对象存储可视化管理工具 源码获取 int main(){ printf("源码联系绿泡泡:%s","joyfelic"); return 0; }

【Ubuntu】提升 docker ps -a 输出的可读性:让 Docker 容器状态更清晰

提升 docker ps -a 输出的可读性:让 Docker 容器状态更清晰 当我们使用 docker ps -a 查看所有 Docker 容器时,输出的信息通常会非常多,尤其是在容器数量较多时。默认输出中包含容器 ID、名称、镜像、状态、端口等信息,容易让人眼…

Spring Security自定义身份认证

尽管项目启动时,Spring Security会提供了默认的用户信息,可以快速认证和启动,但大多数应用程序都希望使用自定义的用户认证。对于自定义用户认证,Spring Security提供了多种认证方式,常用的有In-Memory Authentication…

在亚马逊云服务器上部署WordPress服务

在亚马逊云服务器上部署WordPress服务第一步:创建EC2实例第二步:初始设置与安装第三步:配置MySQL与WordPress第四步:配置Apache与WordPress第五步:访问WordPress第六步:测试数据库连接第七步:使…

Web3.0的认知补充(去中心化)

涉及开发技术: Vue Web3.js Solidity 基本认知 Web3.0含义: 新一代互联网思想:去中心化及用户为中心的互联网 数据:可读可写可授权 核心技术:区块链、NFT 应用:互联网上应用 NFT &…

如何修复宝可梦时时刻刻冒险无法正常工作

宝可梦的时时刻刻冒险模式是一项强大的功能,即使应用程序关闭,它也能追踪你的步行距离。它的工作原理是将你的步数与 iOS 上的 Apple Health 或 Android 上的 Google Fit 同步。它对于孵化宝可梦蛋和赚取好友糖果至关重要,但一旦它停止工作&a…

redis常用集合操作命令

在 Redis 的命令行界面(redis-cli)中, Redis 的集合(Set)是无序的,且集合中的元素是唯一的。Redis 本身没有直接提供获取集合中某个特定属性的命令,因为集合中的元素是简单的值,而不…

初识数据结构——二叉树从基础概念到实践应用

数据结构专栏 ⬅(click) 初识二叉树:从基础概念到实践应用🌳 一、树型结构基础 1.1 树的基本概念 树是一种非线性的数据结构,由n(n>0)个有限节点组成一个具有层次关系的集合。它看起来像一棵倒挂的树,根朝上而叶朝下。 关键特…

驼峰命名法(Camel Case)与匈牙利命名法(Hungarian Notation)详解

驼峰命名法(Camel Case)与匈牙利命名法(Hungarian Notation)详解及对比‌ ‌1. 驼峰命名法(Camel Case)‌ ‌定义‌ 驼峰命名法(Camel Case)是一种变量、函数、类等标识符的命名方…

keil 中优化等级的bug

一,问题描述 程序中代码有的执行,有的不执行,仔细研究,查询人工智能。 程序中printf打印后面的代码不执行, 然后过几十个函数又开始正常了。 二.分析问题 跳过函数一般又判断和Goto等语句,其它的溢出和错误…

织梦dedecms网站如何修改上一篇下一篇的标题字数

一般情况下,如果你的上一篇和下一篇是2行布局就不需要限制标题的字数了,如果你要一行布局上一篇和下一篇标题过长就会打乱网页布局,那么限制上一篇和下一篇的标题字数是需要的,避免页面看起来杂乱不堪。 织梦dedecms网站如何修改…

信创系统 sudoers 权限配置实战!从小白到高手

好文链接:实战!银河麒麟 KYSEC 安全中心执行控制高级配置指南 Hello,大家好啊!今天给大家带来一篇关于信创终端操作系统中 sudoers 文件详解的实用文章!在 Linux 系统中,sudo 是一项非常重要的权限控制机制…

《明解C语言入门篇》读书笔记四

目录 第四章:程序的循环控制 第一节:do语句 do语句 复合语句(程序块)中的声明 读取一定范围内的值 逻辑非运算符 德摩根定律 德摩根定律 求多个整数的和及平均值 复合赋值运算符 后置递增运算符和后置递减运算符 练习…

vite+vue2+elementui构建之 vite.config.js

webpack版本太低,构建依赖太多,头大。 各种查阅资料,弄了一份直通构建vite构建elementUi核心文件, 构建基于开源若依vue2vue3版本改造,感谢开源,感谢若依。 package.json 地址 vitevue2elementui构建之…

超参数详解:从基础概念到优化策略的全面指南

摘要 本文深入解析机器学习中超参数的核心概念,详细对比参数与超参数的本质区别,系统介绍学习率、隐含层数量等常见超参数类型,以及网格搜索、贝叶斯优化等主流寻优方法。结合超参数搜索的标准流程,通过具体案例演示如何高效调整…

计算机视觉与深度学习 | LSTM原理及与卡尔曼滤波的融合

长短期记忆网络(LSTM)是一种特殊的循环神经网络(RNN),旨在解决传统RNN在处理长序列数据时出现的梯度消失和梯度爆炸问题。以下为你详细介绍其基本原理: 核心思想:LSTM的核心思想是引入记忆单元和门控机制来控制信息的流动,从而解决传统RNN的梯度消失问题。记忆单元类似…