蒙特卡洛方法_基本理论-蒙特卡洛方法与定积分
全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者,东汉书院在致力于使得更多人群具备内核级竞争力的道路上,将带给小伙伴们更多的公开技术教学和视频,感谢一路以来有你的支持。我们正在用实际行动来帮助小伙伴们构建一套成体系的图形学知识架构,你在我们这里获得的不止于那些毫无意义的代码,我们这里更多的是代码背后的故事,以及精准、透彻的理解。我们不会扔给人们一本书或者给个思路让人们去自学,我们是亲自来设计出好的课程,让人们明白到底背后还有哪些细节。
这里插播一个引擎大赛的消息,感兴趣的同学可以看一眼,这也是东汉书院的立项使命:
大赛官方主页
东汉书院-自己动手写游戏引擎edu.battlefire.cn
基本概念介绍
求积分其实要么是求面积,要么就是在求体积。可能有的人会觉得积分很讨厌,那么一大堆奇怪的符号,不知道该怎么办,但是实际上这是最自然的去描述一个自然事物的公式。同学们可以去尝试了解一下黎曼和,因为这个家伙在我们的图形学中也很重要,重要的是它的思想,只不过它用了一种逼近的方式去描述出了积分,如果说成是人话的话,那么就是黎曼和用离散的数据去逼近求解得到了连续的积分。不过我们说了,这只是一种思想,实际上我们相信,这种思想只要是个人就能想到,只不过要形成一套整体的方法论和解决方案,我们需要把这些思想武器摆放到正确的位置上。
我们先前的文章介绍了蒙特卡洛方法,它是一种统计学的方法,那么我们怎么把这个统计学的方法与定积分联系起来呢?为什么我们要做这样的一套思路连接呢?那是因为我们在做PBS或者PBR的时候,我们会去一个半球上对一个小区域内的灯光进行球面积分,然后算出这些入射光最终得出了怎样的一个色彩。
为什么我们在PBS或者PBR里要对一个半球上的光线做积分呢?难道我们在传统光栅化的Lmabert光照的计算方式有什么错误吗?要解决这个问题,就需要同学们去学习光线追踪了,我们之所以要在一个半球上对光线做积分,最主要的原因是在现实世界中,射入我们眼睛的光线是由很多光线共同作用的结果,而不是我们在光栅化中提到的那个一个入射光对应一个出射光的模型。所以我们要尽可能的采样更多的光束,才能得到一个相对正确的结果。这也是PBS或者PBR是基于物理的渲染的原因,我们没有说这套渲染方式是:物理渲染。其中的含义就是,我们采用的是一套逼近物理世界的算法在进行渲染,因此叫:Physical Based Rendering或者是Physical Based Shading。
与定积分做连接
我们知道真实的环境中,射到物体表面的光线数量是无限多的,所以我们这里要采用统计学的方式去模拟这种效果,因此我们就需要背后的这套蒙特卡洛方法与无限多的入射光的这一现实问题做思路的对接。
为了说明蒙特卡洛方法是如何解决现实中的连续数据问题的,我们来看看下面这个小例子,这个例子其实就是在求在第一象限,
换成蒙特卡洛方法我们怎么样看待这个问题呢?
其实还是跟之前那个求PI的思路一样,我们之前是在一个边长为2的盒子里,算随机出来的点落在圆里面的概率,那么我们依照这个思路,我们在第一象限里,执行n次下面的操作:
- 在0~2的范围内随机出一个点x,然后求出
- 把所有第一步求出来的
的和求出来为sum
- 然后用sum乘以2再除以n
这便得到了
#include <iostream>
#include <stdio.h>
#include <math.h>
float randf() {return float(rand()) / float(RAND_MAX);
}
float srandf() {return randf()*2.0f - 1.0f;
}
int main(int argc, char **argv) {int count = 1000000;float sum = 0.0f;for (int i=0;i<count;++i){float x = randf()*2.0f;sum += x * x;}printf("area is %fn", 2.0f*sum /float(count));return 0;
}
上面这些代码为什么可以这么写呢?背后我们出于怎样的思路把代码写成这样子的呢?因为我们的定积分公式表示的是
所以对于积分公式而言,我们求的就是这条曲线下面的这块积分面积。这里底边x轴的边长是2,如果我们把求面积的方法写成近似的值的话,我们可以把它看成是把底边切成n份,每一份的宽度是
所以我们最终求得的面积为:
完结撒花,这貌似就是一个求积分吧,跟蒙特卡洛方法有联系?当然是有联系的,我们看到具体的代码实现,不难发现,我们的x并不是等于
如果没办法想明白这个x取随机数的原因,那么可以回想一下先前我们举例的圆的例子,在一个方形内随机一个点,落在圆里的概率,通过那个概率我们可以求出PI的值。
稍后我们再来更新更多内容,直到我们的光照计算模块。
在光照模块来临之前,同学们需要先看懂概念:
疯狂的程序员:引擎内核基础技术-球面坐标是何物zhuanlan.zhihu.com
疯狂的程序员:蒙特卡洛方法-最简单的代码zhuanlan.zhihu.com
我们核心关注和讨论的领域是引擎的底层技术以及商业化方面的信息,可能并不适合初级入门的同学。另外官方维护两个公众号,第一个公众号是关于我们企业自身产品的信息与动态的公众号,如果对我们自身信息与动态感兴趣的同学,可以关注图形之心。我们核心关注和讨论的领域是引擎的底层技术以及商业化方面的信息,可能并不适合初级入门的同学。另外官方维护两个公众号,第一个公众号是关于我们企业自身产品的信息与动态的公众号,如果对我们自身信息与动态感兴趣的同学,可以关注图形之心。
除此之外,我们为了更频繁的发布一些咨询与文章,我们维护的第二个公众号是“内核观察”,内核观察提供的主要是一些与我们无关的咨询与文章。
只言片语,无法描绘出整套图形学领域的方方面面,只有成体系的知识结构,才能够充分理解和掌握一门科学,这是艺术。我们已经为你准备好各式各样的内容了,东汉书院,等你来玩。
蒙特卡洛方法_基本理论-蒙特卡洛方法与定积分相关推荐
- 使用方法_山西硅肥使用方法
山西硅肥使用方法 z8aNjW1e 山西硅肥使用方法 1.硼的营养作用 硼在植物体内比较集中于茎尖.根尖.叶片和花器官中,双子叶植物中的含量常常高于单子叶植物.现阶段草莓植株生长的比较大,基本可以封垄 ...
- 器械传递的方法_手术器械的传递方法
原标题:手术器械的传递方法 1.锐利器械传递方法 洗手护士应与主刀医生站于同侧. (1)手术刀传递方法: ①按.取刀片方法:安装时,用持针器夹持刀片前段背侧,轻轻用 力将刀片与刀柄槽相对和:取刀片时, ...
- js 调用另一个类的方法_一个隐藏在方法集和方法调用中且易被忽略的小细节
来自公众号:新世界杂货铺 作为一个长期从事Go语言开发的程序猿,笔者不敢说自己是老油条但也勉强算一个小油条.然而就在今天,笔者研究TLS/SSL握手源码的时候,突然灵光一闪,想到了一个和自己认知不符的 ...
- python测试用例设计方法_功能测试用例设计方法分享
本文首发于:行者AI 测试用例可以用来衡量一个项目测试质量,因此在平时的测试流程中,编写测试用例就是测试过程中很重要的一步,每一个测试工程师都需要并且非常熟练的编写测试用例,能在编写测试用例中尽可能的 ...
- python降维方法_机器学习数据降维方法总结(附python代码)
介绍 在机器学习实战时,如果面对一个数据集具有上千个特征,那么对于模型训练将是一个巨大的挑战.面对如此多的数据变量,如果我们认真的去分析每一个变量将耗费我们几周甚至几个月的时间,那么你估计也要被开除了 ...
- 切割固定长度字符串的方法_石材加工复合线条方法
石材加工复合线条方法 技术领域 本发明涉及到石材加工,尤其涉及的是一种石材加工复合线条方法. 背景技术 家居室内装修普遍用的都是大理石,大理石主要用于加工成各种形材.板材,用作建筑物的墙面.地面.台. ...
- python __reduce__魔法方法_关于python魔术方法payload:.__class__.__mro__[2].__subclasses__()[40](/etc/passwd...
总览 "".__class__.__mro__[2].__subclasses__()[40]("/etc/passwd").read() 其实就是类似java ...
- 向上取整的方法_瓷砖测量的方法有哪些?瓷砖尺寸一般是多少?
随着瓷砖行业的不断进步和发展,越来越多款式各异的瓷砖出现在人们面前.各种各样规格尺寸的瓷砖构成了丰富多彩的瓷砖市场,接下来就和大家说一说在测量上面,和瓷砖相关的测量方法有哪些,为有需要的人们提供相关帮 ...
- 机械秒表的使用方法_瓦楞纸箱防水性能检测方法
目前具有防水性能的瓦楞纸箱的需求正在日益增长,尤其是在蔬菜.食品.家电及出口产品的包装方面应用逐步增加,极大地促进了瓦楞纸箱制造业的发展. 但是,国家目前对瓦楞纸箱的防水性能尚无明确的检测方法规定,在 ...
最新文章
- AI公开课:19.05.22 Aya Soffer—IBM AI Tech VP《Advanced, scalable, and trusted AI 》课堂笔记以及个人感悟
- 【杂谈】有三AI不得不看的技术综述(超过100篇核心干货)
- python从零基础到项目实战 当当_Python 3.x网络爬虫从零基础到项目实战
- R语言观察日志(part8)-RMarkdown之其他语言
- IntelliJ IDEA 中配置、使用 SVN
- 中关村Win11 32位微软原版ISO V2021.08
- 和谐社区,和谐技术:微软的宠儿们,为什么富人的孩子就不能早当家?
- TensorFlow 教程 --进阶指南--3.6增加一个新 Op
- js:基于原生js的上啦下啦刷新功能
- EMVI5.3 将数据信息改为投影坐标系
- 算法 第四版 2.1.25 不需要交换的插入排序
- java运行环境安装及配置教程
- 原生开发、H5开发和混合式开发的区别
- 【windows系统】插入移动硬盘后,有盘符,但提示需要格式化的解决办法
- python实现程序自动运行的库_python tkiner实现自动打包程序
- stroj uplink
- 使用 canvas 画矩形,实现橡皮擦功能
- swf格式视频播放器、免费绿色免安装
- 块存储、文件存储与对象存储的区别与应用场景
- 【场景化解决方案】旺店通与钉钉打通,实现多包裹数据同步
热门文章
- inv(a) matlab,在MATLAB中,inv(A)表示的是()
- android判断sd u盘,[Android Framework]获取U盘 SD 状态
- java -p_javap命令详解 - JackieYeah的个人空间 - OSCHINA - 中文开源技术交流社区
- 操作系统:166个Linux实用命令,太全了!
- 操作系统:分享6 个“吓人”的 Linux 命令
- python循环顶帖_设计Python数据库连接池1-对象的循环引用问题
- C语言实现与功能的程序,用C语言实现Ping程序功能
- php use闭包参数,php 闭包use的使用
- 多生产者_你是生产者还是消费者?这决定了你的层次。
- Maven,在pom.xml配置JDK 9版本。