
全球圖形學領域教育的領先者、自研引擎的倡導者、底層技術研究領域的技術公開者,東漢書院在致力于使得更多人群具備內核級競爭力的道路上,將帶給小伙伴們更多的公開技術教學和視頻,感謝一路以來有你的支持。我們正在用實際行動來幫助小伙伴們構建一套成體系的圖形學知識架構,你在我們這里獲得的不止于那些毫無意義的代碼,我們這里更多的是代碼背后的故事,以及精準、透徹的理解。我們不會扔給人們一本書或者給個思路讓人們去自學,我們是親自來設計出好的課程,讓人們明白到底背后還有哪些細節。
這里插播一個引擎大賽的消息,感興趣的同學可以看一眼,這也是東漢書院的立項使命:
大賽官方主頁
基本概念介紹
求積分其實要么是求面積,要么就是在求體積。可能有的人會覺得積分很討厭,那么一大堆奇怪的符號,不知道該怎么辦,但是實際上這是最自然的去描述一個自然事物的公式。同學們可以去嘗試了解一下黎曼和,因為這個家伙在我們的圖形學中也很重要,重要的是它的思想,只不過它用了一種逼近的方式去描述出了積分,如果說成是人話的話,那么就是黎曼和用離散的數據去逼近求解得到了連續的積分。不過我們說了,這只是一種思想,實際上我們相信,這種思想只要是個人就能想到,只不過要形成一套整體的方法論和解決方案,我們需要把這些思想武器擺放到正確的位置上。
我們先前的文章介紹了蒙特卡洛方法,它是一種統計學的方法,那么我們怎么把這個統計學的方法與定積分聯系起來呢?為什么我們要做這樣的一套思路連接呢?那是因為我們在做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

我們核心關注和討論的領域是引擎的底層技術以及商業化方面的信息,可能并不適合初級入門的同學。另外官方維護兩個公眾號,第一個公眾號是關于我們企業自身產品的信息與動態的公眾號,如果對我們自身信息與動態感興趣的同學,可以關注圖形之心。我們核心關注和討論的領域是引擎的底層技術以及商業化方面的信息,可能并不適合初級入門的同學。另外官方維護兩個公眾號,第一個公眾號是關于我們企業自身產品的信息與動態的公眾號,如果對我們自身信息與動態感興趣的同學,可以關注圖形之心。
除此之外,我們為了更頻繁的發布一些咨詢與文章,我們維護的第二個公眾號是“內核觀察”,內核觀察提供的主要是一些與我們無關的咨詢與文章。
只言片語,無法描繪出整套圖形學領域的方方面面,只有成體系的知識結構,才能夠充分理解和掌握一門科學,這是藝術。我們已經為你準備好各式各樣的內容了,東漢書院,等你來玩。