日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/9 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蒙特卡洛方法_基本理论-蒙特卡洛方法与定积分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

全球圖形學領域教育的領先者、自研引擎的倡導者、底層技術研究領域的技術公開者,東漢書院在致力于使得更多人群具備內核級競爭力的道路上,將帶給小伙伴們更多的公開技術教學和視頻,感謝一路以來有你的支持。我們正在用實際行動來幫助小伙伴們構建一套成體系的圖形學知識架構,你在我們這里獲得的不止于那些毫無意義的代碼,我們這里更多的是代碼背后的故事,以及精準、透徹的理解。我們不會扔給人們一本書或者給個思路讓人們去自學,我們是親自來設計出好的課程,讓人們明白到底背后還有哪些細節。

這里插播一個引擎大賽的消息,感興趣的同學可以看一眼,這也是東漢書院的立項使命:
大賽官方主頁

東漢書院-自己動手寫游戲引擎?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; }

上面這些代碼為什么可以這么寫呢?背后我們出于怎樣的思路把代碼寫成這樣子的呢?因為我們的定積分公式表示的是

這條曲線與x軸夾著的面積,而 在x的值為0~2的時候,它的曲線大概是下面這樣子的:

所以對于積分公式而言,我們求的就是這條曲線下面的這塊積分面積。這里底邊x軸的邊長是2,如果我們把求面積的方法寫成近似的值的話,我們可以把它看成是把底邊切成n份,每一份的寬度是

,每一份的面積是 ,這樣總面積就是所有的 之和。那么這里 ,所以我們可以通過這樣的公式來求得下面的面積: ,然后這里的 是 ,所以最終的公式可以寫成: ,把 提取出來,那么我們在循環里頭只需要求解:sum = 。

所以我們最終求得的面積為:

。這里n越大,我們最終得到的結果就越精確。

完結撒花,這貌似就是一個求積分吧,跟蒙特卡洛方法有聯系?當然是有聯系的,我們看到具體的代碼實現,不難發現,我們的x并不是等于

,我們的x的值是隨機數,是一個范圍在0~2內的隨機數。為何會如此呢?那就是因為,我們的積分區間是0~2,我們在這個區間內隨機出來一個數字,落在我們 與x軸夾著的面積的概率是確定的,當我們隨機的次數越多,這個面積就會越逼近。

如果沒辦法想明白這個x取隨機數的原因,那么可以回想一下先前我們舉例的圓的例子,在一個方形內隨機一個點,落在圓里的概率,通過那個概率我們可以求出PI的值。

稍后我們再來更新更多內容,直到我們的光照計算模塊。

在光照模塊來臨之前,同學們需要先看懂概念:

瘋狂的程序員:引擎內核基礎技術-球面坐標是何物?zhuanlan.zhihu.com瘋狂的程序員:蒙特卡洛方法-最簡單的代碼?zhuanlan.zhihu.com

我們核心關注和討論的領域是引擎的底層技術以及商業化方面的信息,可能并不適合初級入門的同學。另外官方維護兩個公眾號,第一個公眾號是關于我們企業自身產品的信息與動態的公眾號,如果對我們自身信息與動態感興趣的同學,可以關注圖形之心。我們核心關注和討論的領域是引擎的底層技術以及商業化方面的信息,可能并不適合初級入門的同學。另外官方維護兩個公眾號,第一個公眾號是關于我們企業自身產品的信息與動態的公眾號,如果對我們自身信息與動態感興趣的同學,可以關注圖形之心。


除此之外,我們為了更頻繁的發布一些咨詢與文章,我們維護的第二個公眾號是“內核觀察”,內核觀察提供的主要是一些與我們無關的咨詢與文章。


只言片語,無法描繪出整套圖形學領域的方方面面,只有成體系的知識結構,才能夠充分理解和掌握一門科學,這是藝術。我們已經為你準備好各式各樣的內容了,東漢書院,等你來玩。

總結

以上是生活随笔為你收集整理的蒙特卡洛方法_基本理论-蒙特卡洛方法与定积分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。