GAMES101:现代计算机图形学入门-笔记-09

久违的101图形学回归咯

今天的话题应该是比较轻松的:聊一聊在渲染中比较先进的topics

Advanced Light Transport

首先是介绍一系列比较先进的光线传播方法,有无偏的如BDPT(双向路径追踪),MLT(梅特罗波利斯光传输)(好长的名字),有偏的如光子映射与VCM(顶点连接合并)以及一些实时辐射度方法如VPL等。

既然上文提到了有偏和无偏,那什么才是有偏的,什么才是无偏的呢?

之前我们提到的蒙特卡洛积分中,我们都知道提高采样率能有效提高准确率,但是如果我们发现无论如何提高采样率我们的期望都是相同的值:那就说明这是无偏估计的方法;否则,就是有偏估计。

BDPT

双向的路径追踪我们可以认为就是原来的路径追踪的扩展版:在原来的路径追踪里,我们从摄像机发射一束光线,直至连接至光源,而双向的路径追踪则是从摄像机和光源都发射光线,然后我们将这两根光线的某一端点连接起来,就实现了我们的双向路径追踪。

由图可知:双向路径追踪适合光线传播情况复杂的情景:因为在如图的灯中,光从灯上方被大量地打出,很难找到一条清晰的包含主要能量的光路。

缺点在于:双向路径追踪比较慢,且实现很复杂。

MLT

MLT是基于统计学的一项工具:马尔可夫链,这项工具可以根据已有的样本生成新的样本,比较具体的例子如图:我们在已知了一条光路后,可以利用这项工具对光路里的某个具体的点位稍稍改动得到一条新的光路。

同样的,这种算法也非常适合光线复杂的场景,且由于他只需要一条正确的光路就能生成多条类似的光路,所以对于一些很复杂的情景如泳池下的涟漪这样的画面都可以渲染出来。

缺点在于:首先他的所有工作都是局部的,也就是每条光线都只会生成与自己类似的光线,每条光线都是自己忙自己的,所以本身收敛速度也不可知,且每个像素之间收敛的速度也不一,一般不用于渲染动画(连简单的画面都渲染不明白)

光子映射

光子映射是一个有偏估计方法且是一个有两个步骤的方法,对于SDS的光路渲染尤其在行(什么是SDS呢?就是光线先进入Specular材质如水面,然后再Diffuse如光线在水底,最后再进入Specular材质如水底的光线射出水面)。

光子映射有许多实现的方法,如:

我们首先从光源和摄像机都分别发射光线,任由他们反射直至撞到了diffuse的材质。

接着我们进行局部的密度估计,如何理解局部的密度估计呢?核心的思路是光子越多的区域应该更明亮。我们对于任何一个着色点,去找离他最近的n个光子,然后计算这n个光子与所占的面积的比值即可。

能够看到n的取值会直接影响结果,n如果取得太小如就取2个光子,那么就会有很多噪声(如最上面的图一样明明暗暗),可要是取得太大,又会很糊。这也就是光子估计是一个有偏估计的原因:他的期望会随着采样率的变化而变化,不过我们可以设想:当本身的光子数趋向于无穷时,我们无论取多少个点,n无论为多少,我们所取的面积都只会是很小的一块,这样也就接近了无偏估计的概念。

在这里我们也可以声明两个概念:第一是有偏的界定就是会产生模糊的现象,第二是所谓的Consistent:就是指随着采样率提高至无限后不再产生模糊现象的估计方法。这里还回答了关于局部的密度估计:为什么不是像其他的估计密度的方法一样划定一定的面积范围后在面积内统计光子的数量这样做呢?这是因为这样做的话光子估计会永远是一个有偏估计:哪怕我们有无限个光子,界定了一定的面积范围,那他对面积的积分就无法到达\Delta A的量级。

VCM

接下来要介绍的是VCM的概念:顶点连接合并,他是双向路径追踪和光子映射的一个方法上的结合。这个算法的思路就是在双向路径追踪的过程中如果两条光线的端点无法连接成线,也不要浪费这两个端点,而是把这两个端点的光子当作光子映射的一部分。

IR

IR又称多光方法,简单的说我们将所有已经被照亮的地方都视作光源,这样的话当我们聚焦于某个着色点时我们只需要所有被视作光源的地方(VPL,虚拟光源)向着色点发射光线即可。

优点在于很快而且在漫反射场景表现优秀,缺点在于当虚拟的光源离着色点较近时显然效果很差。

因为当距离过近时,相当于计算光照强度时分母过小,于是会出现光照过强。

Advanced Appearance Modeling

这里提了一些更先进的外观建模,分为了无表面模型与表面模型以及程序化生成的表面。

Participating Media

散射介质如雾。

当光线遇到这些散射介质时,会发生两种情形:被吸收和被散射。

如何散射呢?我们会用一个相位函数来描述光线在散射介质中散射的情形。

散射介质如何渲染呢?原理上来说,充满着随机,随机挑选一个方向,行进随机的距离,然后再与光源连线。

Hair

头发的表现。

值得一提的是,我们能发现头发上有两种高光,一种是偏无色的高光,另一种是有色的高光。

这是我们当前的头发的模型:我们认为光线在头发的表面时,首先会发生一次反射,称为R,然后这束光线会进入头发,之后它再从头发内部出去,我们称为TT,而进入头发的光线也有可能再反射出头发,我们称为TRT。这里的T就是指光线经过头发的表面,R就是指光线发生反射。

我们可以把头发看作一个玻璃柱,同时还要考虑头发中色素的影响(黑头发吸收光线的能力就要强一点,金头发反射的能力更强一点)。

Animal fur

对人类头发的模拟能适用于动物的毛发吗?

由图可知,动物的毛发与人类的头发是有相似之处的。人类和动物的毛发都是由三部分组成,最外面一层用来反射光线,中间一层用来散射光线,最内的一层则用来吸收光线。但是细看的话不难发现;动物内部的用于散射光线的介质(髓质)的成分占比远大于人类。

于是我们在模拟动物毛发时,就可以把动物的毛发视作一个双层的圆柱体,内部的圆柱体就用来模拟髓质(这个模型是闫老师提出的)。

这是在内部的情形。

Granular

接下来介绍一下颗粒模型

这个部分貌似说的是没有很合适的方法...

之前说的都是非表面模型,接下来让我们了解下表面模型。

Translucent

透光性的材质如:玉。

所谓的透光性材质指的是当光从这种材质进入后在材质内还可以从材质表面的另一个地方出去。

当光线进入这样的材质会在材质内部发生大量的散射,我们将这样的在表面下的散射称为:次表面散射。

由此引出的BSSRDF的概念可以视作之前BRDF的概念的延伸,之前我们计算BRDF的时候往往只考虑一根光线打到表面这样一个过程,而现在次表面散射的存在告诉我们:表面上可能有多个光,其中部分光可以是从介质内部投射出来,因此我们需要加入对方向和面积的考虑。

我们可以将这样的现象想象成:当我们有一个光源在这个表面的正上方时,这个介质内也有一个类似的光源将光线进入介质的周围点亮,我们就通过这样的方法来模拟这样的情景。

Cloth

布料:由一系列纤维缠绕组成。

一般的,我们将布料认作是一个平面上一系列细而平的线条的组合即可。

可缺陷在于:如果遇到并不是在一个平面内的纤维组成的布料如图二,我们这样的方法行不通。

比较合理的做法是我们不再拘泥于平面而直接采用体积渲染,将布料分作很多个独立的小块。这样当然可以得到最理想逼真的结果,但是这样的计算量将大到难以估计。

当然,我们也可以直接渲染出纤维(一根根立方体),但这样的计算量也很惊人。

后续还聊了些有关细节渲染的东西,我看了一下,这节课的内容总的来说是了解为主,暂时对我们的学习没有啥帮助,我也就不浪费时间了(小偷一手懒)。

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

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

相关文章

【C++篇】排队的艺术:用生活场景讲解优先级队列的实现

文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

【unity】WebSocket 与 EventSource 的区别

WebSocket 也是一种很好的选择,尤其是在需要进行 双向实时通信(例如聊天应用、实时数据流等)时。与 EventSource 不同,WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下:…

Oracle 数据库 IDENTITY 列

IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列,是由于其支持ANSI SQL 关键字 IDENTITY,其内部实现还是使用SEQUENCE。 不过推出这个新语法也是应该的,毕竟MyQL已经有 AUTO_INCREMENT列,而SQL Server也已经有IDENT…

前端学习笔记之文件下载(1.0)

因为要用到这样一个场景,需要下载系统的使用教程,所以在前端项目中就提供了一个能够下载系统教程的一个按钮,供使用者进行下载。 所以就试着写一下这个功能,以一个demo的形式进行演示,在学习的过程中也发现了中文路径…

【阅读记录-章节4】Build a Large Language Model (From Scratch)

文章目录 4. Implementing a GPT model from scratch to generate text4.1 Coding an LLM architecture4.1.1 配置小型 GPT-2 模型4.1.2 DummyGPTModel代码示例4.1.3 准备输入数据并初始化 GPT 模型4.1.4 初始化并运行 GPT 模型 4.2 Normalizing activations with layer normal…

浅谈——深度学习和马尔可夫决策过程

深度学习是一种机器学习方法,它通过模拟大脑的神经网络来进行数据分析和预测。它由多层“神经元”组成,每一层从数据中提取出不同的特征。多层次的结构使得深度学习模型可以捕捉到数据中的复杂关系,特别适合处理图片、语音等复杂数据。 马尔可…

Python PDF转JPG图片小工具

Python PDF转JPG图片小工具 1.简介 将单个pdf装换成jpg格式图片 Tip: 1、软件窗口默认最前端,不支持调整窗口大小; 2、可通过按钮选择PDF文件,也可以直接拖拽文件到窗口; 3、转换质量有5个档位,(0.25&a…

「qt交叉编译arm64」支持xcb、X11

完整的交叉编译好支持xcb的qt库(qt5.15.2、arm64、xcb、no-opengl) 已安装xcb、X11库的交叉编译器(x86_64-aarch64-linux-gnu) 文章目录 1. 修改qmake.conf,指定交叉编译器2. 配置编译选项,执行configureL…

使用SOAtest进行功能回归测试

持续集成是将所有开发人员的工作副本合并到共享的主线上。这个过程使软件开发对开发人员来说更容易访问、更快、风险更小。 阅读这篇文章,让我们了解如何配置Parasoft SOAtest作为持续集成过程的一部分,来执行功能测试和回归测试。我们将介绍如何使用主…

ais_server 学习笔记

ais_server 学习笔记 一前序二、ais init1、时序图如下2. 初始化一共分为以下几个重要步骤:2.1.1、在ais_server中启动main函数,然后创建AisEngine,接着初始化AisEngine2.1.2、解析/var/camera_config.xml 文件,获取相关配置参数。…

L1G3000 任务-浦语提示词工程

基础任务 (完成此任务即完成闯关) 背景问题:近期相关研究指出,在处理特定文本分析任务时,语言模型的表现有时会遇到挑战,例如在分析单词内部的具体字母数量时可能会出现错误。任务要求:利用对提示词的精确设计&#xf…

Unity之一键创建自定义Package包

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之一键创建自定义Package包 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! …

Redis开发04:Redis的INFO信息解析

命令解释redis_versionRedis 的版本号,这里是 3.2.100。redis_git_sha1Redis 使用的 Git SHA1 校验值,表示当前代码的版本。redis_git_dirty如果 Redis 当前运行的代码是脏版本(未提交的修改),该值为 1,否则…

python的Flask框架使用

python的Flask框架使用 python环境搭建conda安装python自带的虚拟环境:venv python环境搭建 官网地址 点击downloads 选择你需要的版本,我这里使用的3.12.6 选择Windows installer (64-bit) 选择自定义安装,勾选以管理员权限安装&#xff0…

网络原理(一)—— http

什么是 http http 是一个应用层协议,全称为“超文本传输协议”。 http 自 1991 年诞生,目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的,例如 http1.0,http1.0,http2.0 http3 是…

CTF之密码学(Polybius密码)

棋盘密码,也称为Polybius密码或方格密码,是一种基于替换的加密方法。以下是对棋盘密码的详细解析: 一、加密原理 棋盘密码使用一个5x5的方格棋盘,其中填充了26个英文字母(通常i和j被视为同一个字母并放在同一个格子中…

二刷代码随想录第16天

513. 找树左下角的值 找到深度最大的点,遍历方式左边节点在右边节点前面,找到就返回,一定就是最左下角的值了 class Solution { public:int max_depth -1;int result 0;int findBottomLeftValue(TreeNode* root) {traversal(root, 0);ret…

Dockerfile docker-compose

1、Dockerfile # 使用官方的Python作为基础镜像 FROM python:3.9 # 设置工作目录 WORKDIR /app # 复制当前目录下的所有文件到容器的工作目录中 COPY . /app # 安装所需的Python库 #RUN pip install --no-cache-dir -r requirements.txt # 复制 requirements.txt 并安装依赖…

103.【C语言】数据结构之建堆的时间复杂度分析

1.向下调整的时间复杂度 推导 设树高为h 发现如下规律 按最坏的情况考虑(即调整次数最多) 第1层,有个节点,最多向上调整h-1次 第2层,有个节点,最多向上调整h-2次 第3层,有个节点,最多向上调整h-3次 第4层,有个节点,最多向上调整h-4次 ... 第h-1层,有个节点,最多向上调整1次 第…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言:数据的宝藏 在这个信息爆炸的时代,数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说,1688上的商品详情就是那些闪闪发光的金子。今天,我们将化身为数据的海盗,用Python这把锋利的剑&#xff0…