鏈接:https://www.zhihu.com/question/31971846/answer/367279624
來源:知乎
假設我們在一個空的三維空間中,創建了三個點

我們知道,要確定一個面,至少得有三個點,而一個物體的構成,就是一個個的面,在圖形學中,我們一般用三角面代替

這是在我們假象的三維空間中,但是我們要在二維的顯示器中看到他,我們就稱之為把三角形從三維空間渲染到二維空間中 。

在現實世界中,三角形會將光線向各個方向散射。但是對於一台電腦,根本不可能去計算所有不同方向的光線

所以,我們計算機渲染圖像,僅僅計算了那些散射到我們人眼方向得光線 , CG里面也叫攝像機方向 ,圖形學中稱之為 視角方向 。
所以讓我們在 3D 空間中添加一個攝像頭 ,並在前面透視點讓我們放置一個屏幕網格,其中每個框是我們渲染圖像的一個像素。

現在,我們只畫出與我們相機的透視點相交的一條光線。 如果這些光線相交於我們的屏幕,那么屏幕就能知道我們觀察這個三角形的邊界

我們將標出這個三角形的邊框:

我們知道邊界之后,在邊界與像素之間重疊得部分渲染像素,其余地方不做處理,我們就得到了這個三角形的圖像:

這種投影到像素格子的方法就是是計算機圖形學中的光柵化渲染方法。
這是七十年代的圖形科學家所研究的內容,並且至今仍然是GPU渲染管線的一部分
除了光柵化,還有另一種方法 - ray casting :
讓我們回到我們的3D對象空間,但這次我們將添加第二個三角形:

光柵化是以物體為中心的,這意味着我們從相機捕捉 物體所發射到相機的光線,而
Ray casting 以圖像為中心 ,也就是說,如果我們只考慮那些實際有用的光線
(進入相機的光線) - 那為什么不把這些光線從相機發射到場景中去呢 ?
所以這一次,我們將從我們的虛擬相機開始,並通過相機向每一個像素都發射一條光線:

現在我們將判斷每條射線是否射中了我們的每一個三角形 ,如果一個光線遇到多個物體 - 我們會取最近的那個點。

這個過程解決了困擾光柵化技術的一個重要問題,那就時可見性問題,如果是光柵化,那時候還不知道怎么解決遠近遮擋問題 。但是后來,光柵化的解決方案是一種稱為Z緩沖器的技術 , 它創建了一個深度圖,然后根據該深度圖檢查了所有內容。但是Ray casting就不用這么麻煩。

但是他也有很大的弊端,就是計算量實在是太大了,因為他要判斷相當多的射線與物體的三角面是否相交 ,假設我們有一個1000 x 1000 像素的圖像,那么我們就要計算 1,000,000 條光線來檢查是否和場景中一個多邊形相交,對計算機來說,這計算也是相當的費勁,即使現在在算法上有了很大的改進,但仍然需要進行大量計算。
由於這個原因,在20世紀70年代的大部分時間里,光線投射並沒有被廣泛的研究
但是光柵化有三個問題一直沒有人能夠很好地解決:那就是如何模擬真正的陰影,反射和折射。
后來,解決辦法還是回到Ray Casting ,並在這項舊技術上添加新的變化。
1980年,在貝爾實驗室工作的一位名叫Turner Whitted 的工程師在 SIGGRAPH 發表了一篇論文,題為“An Improved illumination Model for Shaded Display”,一手解決了陰影,反射和折射問題。
Whitted的技術稱為遞歸的 射線追蹤 Ray tracing 。
我們還是從相機的射線開始像之前一樣。

這些被稱為主光線。但是,當主光線接觸一個表面,Whitted的方法是畫出反射射線。

為了解決陰影問題,我們通過在反射方向上繪制二次光線來繪制陰影光線,只要這個光線可以反射到光源,那么我們就知道是光源照亮的這個物體。

如果我們發現光與表面之間存在物體,這時,表面就處於陰影中 。

當光線遇到表面反射,我們使用入射角繪制反射光線,以不斷反射下去,看看這條反射光線在哪里。

如此不斷的反射,所以被稱之為 ,遞歸射線追蹤。
如果對象是透明的,則需要類似的過程。但是使用角就變成使用折射率來確定新的折射光線的角度:

最終光線追蹤得到的效果就是 :

所以,正如你所看到的那樣,讓Ray Casting 更好的解決方案就是 繪制和分析 更多的光線。

這是Turner Whitted 1980年在他的論文中第一張光線追蹤圖像之一 , 在這張圖片中,明顯的陰影,反射和折射效果。這512x512渲染圖花了74 分鍾。
不像光柵化,遞歸光線追蹤 實際上是模擬真實光線在物體周圍反射時的真實行為,但是對真實的表現,還是遠遠不夠的,后來又有大量的人們開始進入該領域深入研究,並在計算機科學中,投入大量的時間盡力,開始研究光線追蹤算法 ,以此來真正模擬光的規律。
即使光線追蹤產生非常逼真的陰影,反射和折射,像運動模糊和景深場這樣的問題可以相對容易地解決,但是最多具有極復雜的光線模擬:
其中,最重要的應該是間接照明 , 相對直接照明是指光直接照射並被物體反射。但在真實世界的光線不僅來自光源


1986年,James Kajiya 發表了一篇名為“rendering equation”的論文。於是世界就不一樣了。這個方程我們稍后再講,

它基於Conservation of energy【能量守恆】和 麥克斯韋方程,來正確地模擬應該被感知的光線 。

同樣,渲染方程最難的一點也是計算 。
所以在發展過程中,游戲渲染采用了許多策略來嘗試找到計算的捷徑。
最早的是嘗試從許多不同的方面呈現基本光線追蹤圖像的光能傳遞角度和求取他平均值。
后來 , 又出現了蒙特卡羅積分,這是基於概率的一種近似方式,可以通過求平均來求解積分,這個方法運用了大量的隨機值 。來對光線進行采樣和優化 。
后來運用到渲染方程已經是十年后了,皮克斯的第一部全長CGI電影:玩具總動員於1995年問世 :

此后的日子里,人們就像這樣,仿佛找到了研究的方向,不斷的尋求積分的最優解,有快解。
於是,不斷的追求速度與精度,就成了圖形學發展的最重要的方向 。