全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者,东汉书院在致力于使得更多人群具备内核级竞争力的道路上,将带给小伙伴们更多的公开技术教学和视频,感谢一路以来有你的支持。我们正在用实际行动来帮助小伙伴们构建一套成体系的图形学知识架构,你在我们这里获得的不止于那些毫无意义的代码,我们这里更多的是代码背后的故事,以及精准、透彻的理解。我们不会扔给人们一本书或者给个思路让人们去自学,我们是亲自来设计出好的课程,让人们明白到底背后还有哪些细节。
这里插播一个引擎大赛的消息,感兴趣的同学可以看一眼,这也是东汉书院的立项使命:
大赛官方主页
基本概念介绍
求积分其实要么是求面积,要么就是在求体积。可能有的人会觉得积分很讨厌,那么一大堆奇怪的符号,不知道该怎么办,但是实际上这是最自然的去描述一个自然事物的公式。同学们可以去尝试了解一下黎曼和,因为这个家伙在我们的图形学中也很重要,重要的是它的思想,只不过它用了一种逼近的方式去描述出了积分,如果说成是人话的话,那么就是黎曼和用离散的数据去逼近求解得到了连续的积分。不过我们说了,这只是一种思想,实际上我们相信,这种思想只要是个人就能想到,只不过要形成一套整体的方法论和解决方案,我们需要把这些思想武器摆放到正确的位置上。
我们先前的文章介绍了蒙特卡洛方法,它是一种统计学的方法,那么我们怎么把这个统计学的方法与定积分联系起来呢?为什么我们要做这样的一套思路连接呢?那是因为我们在做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我们核心关注和讨论的领域是引擎的底层技术以及商业化方面的信息,可能并不适合初级入门的同学。另外官方维护两个公众号,第一个公众号是关于我们企业自身产品的信息与动态的公众号,如果对我们自身信息与动态感兴趣的同学,可以关注图形之心。我们核心关注和讨论的领域是引擎的底层技术以及商业化方面的信息,可能并不适合初级入门的同学。另外官方维护两个公众号,第一个公众号是关于我们企业自身产品的信息与动态的公众号,如果对我们自身信息与动态感兴趣的同学,可以关注图形之心。
除此之外,我们为了更频繁的发布一些咨询与文章,我们维护的第二个公众号是“内核观察”,内核观察提供的主要是一些与我们无关的咨询与文章。
只言片语,无法描绘出整套图形学领域的方方面面,只有成体系的知识结构,才能够充分理解和掌握一门科学,这是艺术。我们已经为你准备好各式各样的内容了,东汉书院,等你来玩。