蒙特卡洛方法_基本理论-蒙特卡洛方法与定积分

fa9c66137cd62e0f4911ed5aa31235cf.png

全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者,东汉书院在致力于使得更多人群具备内核级竞争力的道路上,将带给小伙伴们更多的公开技术教学和视频,感谢一路以来有你的支持。我们正在用实际行动来帮助小伙伴们构建一套成体系的图形学知识架构,你在我们这里获得的不止于那些毫无意义的代码,我们这里更多的是代码背后的故事,以及精准、透彻的理解。我们不会扔给人们一本书或者给个思路让人们去自学,我们是亲自来设计出好的课程,让人们明白到底背后还有哪些细节。

这里插播一个引擎大赛的消息,感兴趣的同学可以看一眼,这也是东汉书院的立项使命:
大赛官方主页

东汉书院-自己动手写游戏引擎​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

这便得到了

的图像与x轴夹着的区域的面积的近似逼近值。我们把这些思路写成代码就是下面这样,运行结果正好是8/3=2.66667,完美。
#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;
}

a43f769f3b54f25e82372f4002d37fa6.png

上面这些代码为什么可以这么写呢?背后我们出于怎样的思路把代码写成这样子的呢?因为我们的定积分公式表示的是

这条曲线与x轴夹着的面积,而
在x的值为0~2的时候,它的曲线大概是下面这样子的:

f2d9226a17f9ce6e3b871a9d25c2e03a.png

所以对于积分公式而言,我们求的就是这条曲线下面的这块积分面积。这里底边x轴的边长是2,如果我们把求面积的方法写成近似的值的话,我们可以把它看成是把底边切成n份,每一份的宽度是

,每一份的面积是
,这样总面积就是所有的
之和。那么这里
,所以我们可以通过这样的公式来求得下面的面积:
,然后这里的
,所以最终的公式可以写成:
,把
提取出来,那么我们在循环里头只需要求解:sum =

所以我们最终求得的面积为:

。这里n越大,我们最终得到的结果就越精确。

完结撒花,这貌似就是一个求积分吧,跟蒙特卡洛方法有联系?当然是有联系的,我们看到具体的代码实现,不难发现,我们的x并不是等于

,我们的x的值是随机数,是一个范围在0~2内的随机数。为何会如此呢?那就是因为,我们的积分区间是0~2,我们在这个区间内随机出来一个数字,落在我们
与x轴夹着的面积的概率是确定的,当我们随机的次数越多,这个面积就会越逼近。

如果没办法想明白这个x取随机数的原因,那么可以回想一下先前我们举例的圆的例子,在一个方形内随机一个点,落在圆里的概率,通过那个概率我们可以求出PI的值。

稍后我们再来更新更多内容,直到我们的光照计算模块。

在光照模块来临之前,同学们需要先看懂概念:

疯狂的程序员:引擎内核基础技术-球面坐标是何物​zhuanlan.zhihu.com
c72a40ddcdbcca5890468b58b8560944.png
疯狂的程序员:蒙特卡洛方法-最简单的代码​zhuanlan.zhihu.com
8aef55a0bcdefb5a315f885fae0c6a8b.png

我们核心关注和讨论的领域是引擎的底层技术以及商业化方面的信息,可能并不适合初级入门的同学。另外官方维护两个公众号,第一个公众号是关于我们企业自身产品的信息与动态的公众号,如果对我们自身信息与动态感兴趣的同学,可以关注图形之心。我们核心关注和讨论的领域是引擎的底层技术以及商业化方面的信息,可能并不适合初级入门的同学。另外官方维护两个公众号,第一个公众号是关于我们企业自身产品的信息与动态的公众号,如果对我们自身信息与动态感兴趣的同学,可以关注图形之心


除此之外,我们为了更频繁的发布一些咨询与文章,我们维护的第二个公众号是“内核观察”,内核观察提供的主要是一些与我们无关的咨询与文章。


只言片语,无法描绘出整套图形学领域的方方面面,只有成体系的知识结构,才能够充分理解和掌握一门科学,这是艺术。我们已经为你准备好各式各样的内容了,东汉书院,等你来玩。

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

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

相关文章

字节面试官:如何实现Ajax并发请求控制

偷偷告诉你&#xff0c;点此抽奖送红包还送3本比红宝书还贵的书实现一个批量请求函数 multiRequest(urls, maxNum)&#xff0c;要求如下&#xff1a; • 要求最大并发数 maxNum • 每当有一个请求返回&#xff0c;就留下一个空位&#xff0c;可以增加新的请求 • 所有请求完成后…

制造行业电子化签约及印控一体化解决方案

当生产“智造化”、营销“数字化”成为趋势&#xff0c;生产制造型企业如何实现产品生产-销售全流程提速降本&#xff1f;生产制造型企业为了在生产、营销环节降低成本、提升效率&#xff0c;经营模式上常有如下特征&#xff1a;• 原料导向&#xff0c;多点协同生产&#xff1…

一起手写Vue3核心模块源码,掌握阅读源码的正确方法

最近和一个猎头聊天&#xff0c;说到现在前端供需脱节的境况。一方面用人方招不到想要的中高级前端&#xff0c;另一方面市场上有大量初级前端薪资要不上价。特别是用 Vue 框架的&#xff0c;因为好上手&#xff0c;所以很多人将 Vue 作为入门框架&#xff0c;但学得深的人并不…

2020 前端技术发展回顾

大家好&#xff0c;我是若川&#xff0c;今天给大家分享一篇来自阿里妈妈前端快爆的好文。另外&#xff0c;偷偷告诉你&#xff0c;截止今晚9点 点此抽奖送红包还送3本比红宝书还贵的书可以点击文章末尾阅读原文直达知乎链接&#xff0c;以下是正文2020 终究是一个不平凡的一年…

第一章知识点

第一章知识点 一&#xff1a;SQL语言 1&#xff0c;结构化查询语言&#xff0c;是关系数据库的标准语言 2&#xff0c;分类&#xff1a; 2.1&#xff1a;数据操作语言&#xff1a;DML&#xff1b;包括&#xff1a;即增删查改&#xff1b;insert&#xff0c;update&#xff0c;d…

2021年,推荐这几个优质公众号碎片化学习

2021 年了&#xff0c;前端技术日新月异&#xff0c;发展迅速&#xff0c;前端公众号是不是感觉越来越多了&#xff1f;在着辞旧迎新之际&#xff0c;这里盘点几个前端开发工程师 2021 年必须关注的优质公众号&#xff0c;希望对你有所帮助。大家可以像我一样&#xff0c;利用碎…

阿里云插件新版发布,多特性助力提升开发者体验

好消息&#xff01;阿里云 Cloud Toolkit 新版本于近日正式发布&#xff0c;推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件&#xff0c;多个重大特性&#xff0c;持续提升开发者体验&#xff0c;本文将带大家快速预览该新版本。 本文只挑选下面三个重大特性进行解读&…

上一轮中奖信息公布

大家好&#xff0c;我是若川&#xff0c;抽奖活动其实挺耗时耗力的&#xff0c;尤其是留言和在看抽奖。比如我这篇文章写完就已经23:50了。特别想说的是&#xff1a;有126人点击了在看&#xff0c;但我的好友展示只有93人在看。说明还有30多人点击了在看&#xff0c;但忘记加我…

CentOS7Jenkins安装

2019独角兽企业重金招聘Python工程师标准>>> CentOS7Jenkins安装 2017年05月07日 20:20:32 申明霜 阅读数&#xff1a;13945 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/sms15732621690/article/details/713…

2020 全球 JS 现状调查报告

大家好&#xff0c;我是若川。偷偷告诉你&#xff0c;今天推文的第二条是在我的公众号回复「网盘」免费领取百度网盘会员&#xff0c;欢迎大家分享转发。给大家分享一篇好文&#xff0c;往期类似好文&#xff1a;2020 前端技术发展回顾2020年大前端技术趋势解读以下是正文&…

ie兼容响应式布局的实现总结 和 针对ie浏览器的CSS

参考链接&#xff1a;http://zhidao.baidu.com/link?urlbQioDKMnG_eQoE6dCxzd2hPtMyiB7phu6hBdOupn1Pjk1hV-ItXFZS5GDUBoH5qrfi9LXkUoSciXTiGN36G6LK 参考链接&#xff1a;http://blog.sina.com.cn/s/blog_601b97ee0101aszo.html ie浏览器hack .demo {padding:10px;padding:9…

group by 保留哪一条数据_使用R语言绘制一维数据统计图总结

加载数据 绘制茎叶图 绘制直方图 绘制概率密度曲线 绘制小提琴图 绘制箱线图 绘制小提琴图箱线图 集中趋势统计 分散程度 apply的使用加载数据模拟数据下载library(tidyverse) cjb <- read.csv("/home/wy/Downloads/cjb.csv",header TRUE,stringsAsFactors FALS…

npm安装和Vue运行

一、开始&#xff1a; 下载地址&#xff1a;http://nodejs.cn/download/ 下载安装&#xff1a; 直到 二、打开CMD,检查是否正常 在安装目录里新增两个文件夹 然后运行命令&#xff1a;如下图&#xff1a; npm config set prefix "D:\InstallSoftWare\nodejs\node_global&q…

Scott 32 岁前端年终总结,探寻另一种可能

今年一年都是飞快 这 10 年编程好时光&#xff0c;花费在不经意间&#xff0c;而立的第三年也即将用完&#xff1a;23 到 26 岁&#xff0c;花在了阿里&#xff0c;从入门到职业迷茫&#xff0c;27 到 29 岁&#xff0c;花在了创业&#xff0c;从热血到倒闭还钱&#xff0c;30 …

跨页数据传递的两种方式

选择具有PostBackUrl属性的三个控件Button、LinkButton、ImageButton。PostBackUrl属性的值就是投递的页面URL。 要在接收页面按对象的方式接收投递页面的表单中的值有两种方式&#xff1a; 1、PreviousPage.FindControl(“控件变量名”)&#xff0c;这个方法返回的是Control类…

嵌入式操作系统 NuttX 5.0 发布

Nuttx 是一个实时嵌入式操作系统&#xff08;RTOS&#xff09;&#xff0c;它有一个小巧是在微控制器的环境中使用。这是完全可扩展&#xff0c;从小型&#xff08;8位&#xff09;至中型嵌入式&#xff08;32位&#xff09;系统。它的目的还 在于要完全符合标准&#xff0c;完…

Windows下Mysql 的安装和卸载

2019独角兽企业重金招聘Python工程师标准>>> 一、安装 1、下载zip文件 2、解压&#xff0c;在bin目录下新建my.ini [mysql] # 设置mysql客户端默认字符集 default-character-setutf8 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirC:\Program Fil…

现在学前端还来得及吗?总听人说饱和了

“前端已经饱和了&#xff0c;现在学前端没有前途了”每次听到这种论调我都气不打一处来。自己技艺不精&#xff0c;然后就说市场饱和了。是&#xff0c;现在的确不是那个会切个图&#xff0c;懂点htmlCSS就能找到工作的年代了。现在对前端的技术要求稍微高了点&#xff0c;但这…

DotNetNuke 5 C#版本解读之2--HTTP Modules

在前面文章里说明了DNN的架构&#xff0c;下面这个图应该说是更加能够全面的让你去了解它的结构&#xff1a; 如果你是个asp.net新手建议你看看前面这部分&#xff0c;因为它会向你介绍什么是http module,以及其他的一些概念。我想通过你读这篇文章来明白asp.net的机制&#xf…

用框架的你,可能早已忽略了这些事件API

DOMContentLoaded&#xff0c;load&#xff0c;beforeunload&#xff0c;unloadHTML 页面的生命周期包含三个重要事件&#xff1a;DOMContentLoaded —— 浏览器已完全加载 HTML&#xff0c;并构建了 DOM 树&#xff0c;但像 <img> 和样式表之类的外部资源可能尚未加载完…