GAMES101-現代計算機圖形學入門-閆令琪 - lecture7 着色(Shading) - 課後筆記

着色(Shading)

  • 可視性 / 遮擋
    • Z - 緩衝 (Z - buffering,深度緩衝)
  • 着色
    • 光照 和 着色 (illunmination & Shading)

畫家算法(Painter 's Algorithm)

先註明一下,這裏的畫家指的是油畫家。畫家算法的提出主要是爲了實現深度緩衝

畫家在畫油畫是,總是會從遠景開始畫,然後逐漸畫近景覆蓋遠景,比如下圖:最先畫出一個藍色的山,然後接着畫綠地覆蓋藍色的閃,然後再接着畫上幾棵樹覆蓋綠地。
在這裏插入圖片描述

參考這個畫家算法,我們要在圖形學中畫一個正方形就要如下的步驟:

在這裏插入圖片描述

先畫出最後面的那個面,然後再畫左面和下面,之後再畫上面和右面,最後畫正面。就可以得到這樣一個正方體。先畫背面最後畫正面可以理解,那麼四個側面的順序是如何決定的?目前我們只是暫時用這種畫法,沒有什麼特殊的決定方法。但是若更改一下順序,先畫上面和左面,再畫右面和底面,就會導致右面有一條線無法被覆蓋,立方體的上面就會多出一條線。

按照畫家算法的思想,要先對三角形的深度進行排序(O(nlogn)),排完序之後再按照從深到淺的順序畫三角形。但是這樣實際應用的時候就會有問題,如下圖:
在這裏插入圖片描述

你無法對這三個三角形按照深度的順序進行排序。

深度緩衝(Z - Buffer / Depth Buffer)

z緩衝是當前使用較多的深度測試的方法,先聲明一些問題:由於Camera是放在座標原點指向-z軸(屏幕裏面的),那麼一個物體的z的座標越小,這個物體離我們就越遠;z的座標值越大,離我們就越近。但是這裏我們計算物體所處的深度時不這麼取值,因爲深度只能是一個大於0的數,所以我們取z的絕對的作爲一個物體的深度。

其思想是:

  • 對於每一個像素,我們存在一個當前最小的|z|作爲這個像素繪製的物體的深度
  • 需要一個額外的緩衝來記錄每一個像素的深度值(|z|)
    • 幀緩衝(frame buffer)存儲每一個像素的顏色的值(color values)
    • 深度緩衝(z - buffer)存儲每一個像素的深度值

z - buffer的例子

在這裏插入圖片描述

如上所示,需要兩個緩衝,一個緩衝存儲最終的渲染效果,而另外一個z - buffer則用來存儲每個像素的深度值。在深度圖像上,一個像素的深度值越大,那麼該點就會越白,如果深度值越小,該點就會越黑。(爲什麼?當取色範圍爲0-1時,color = 0爲黑色,color = 1爲白色,深度越小,對應的顏色值就越小,反應到圖像上就是越黑,反之越白)在渲染中深度緩存是怎麼工作的?我們可以單看一個像素點,比如立方體的左上角的點,我們在繪製圖像時,先在該像素點上繪製了一個地板的顏色,然後在繪製立方體時,發現立方體的深度值比地板的深度值要小,那麼就在這個像素點上繪製立方體的顏色來覆蓋地板。

深度緩衝的算法(Z - Buffer Algorithm)

在這裏插入圖片描述

先把所有像素的深度值都初始化爲無限大,然後對於每個三角形而言,對於三角形上的每一個像素點,如果這個像素點的深度值小於深度緩衝中的深度值,在該像素點繪製三角形的rgb顏色,然後更新深度緩衝的深度值爲當前繪製的三角形的在該點的深度值;否則就什麼都不做。

用圖像來說明就如下:

在這裏插入圖片描述

上面僅代表深度圖,而不是最後的成品圖,其中R代表無限大。

爲了實現z - buffer , 圖形學中通常採用的做法是:在渲染最後成品圖的同時,也會同時生成另外一個深度圖像,這個深度圖像只存儲了任何一個像素他所看到的幾何物體中最淺的深度信息。

深度緩衝的時間複雜度(Z - Buffer Complexity)

  • 對於n個三角形而言,其時間複雜度爲O(n)
  • 因爲這個算法並沒有對三角形進行排序之類的工作,只是對在每一個像素上進行了一個判斷,如果深度值小就寫入,如果深度值大就什麼也不做。比如說有三個覆蓋100個像素的三角形,對這三個三角形所作的工作就是將其深度值與深度緩存比較,一個一個像素填入,所做的操作次數就是 3 * 100。所以時間複雜度其實就是 = 三角形的個數 × 每個三角形覆蓋的像素的數。是一個O(n)的時間複雜度。

如果按照不同的順序,用z - buffer 進行繪製三角形,會有什麼效果?

結果不變,z - buffer 只記錄了深度,和繪圖的順序沒有關係。

接下來是新課內容:

着色(Shading)

  • 光照和着色(illumination & Shading)
  • 圖形渲染管線(Graphics Pipeline)

我們到目前位置做了什麼?

在這裏插入圖片描述

我們現在空間中拜訪物體(Modeling transform,左上),然後將相機變換到原點的位置,並且旋轉其指向方向(viewing transform, 右上);然後在相機的角度,對物體進行投影到屏幕上(projection transform,左下);最後進行光柵化,將物體繪製在屏幕上(右下)。

看一個例子:

在這裏插入圖片描述

根據目前我們所學習的內容,我們可以做出這樣的一系列的立方體,但是看上去並不像我們平時所觀察的立方體,得不到我們想要的效果,而我們想要的效果如下:

在這裏插入圖片描述

就可以發現,兩幅圖中,相差的效果就是光照

但又不是單純的只缺少了光照,現實生活中,不同的物體,因爲物體的材質不同,對於光照的表現效果也是不同的。
在這裏插入圖片描述

着色(Shading)

着色的定義:通過平線性或者色塊在圖中引入不同的明暗和顏色。
在這裏插入圖片描述

Shading在圖形學中定義是:對不同的物體用不同的材質進行着色

一個簡單的着色模型(Blinn - Phong Relectance Model)

在這裏插入圖片描述

光源在右上的方向,光源照亮了所有的茶杯,可以看到茶杯上有一些顏色不同的地方

  • 可以看到茶杯上有一個高光(Specular highlights)
  • 茶杯表面除了高光外,其餘顏色變化並不劇烈的地方,我們稱之爲漫反射(diffuse reflection)
  • 光源在右上,在茶杯的背面應該看不到這個光源,那麼茶杯的背面應該是黑色。但是我們看到了這個茶杯的背面並不是黑色,也就是說有一些的光從茶杯的背面反射到了我們的眼裏,那麼這個點一定是接受到了光。但是這個點接受到的並不是直接光照,而是間接光照。比如說光找到牆上,牆面發生了一個漫反射將光反射到了桌面上,光再經過桌面的反射就能到茶杯的背面。假如說任何一個點都能夠接收到來自環境的反射光,這個反射光就是環境關照(Ambient lighting)

計算某一着色點的光照

計算一個點的光照,需要的的輸入有:

  • 觀察者的方向向量 (Viewer direction , v)
  • 着色點所在表面的法向量(Surface normal , n)
  • 光線照射的方向向量(Light direction , I)
  • 着色點表面的一些參數(顏色,材質,反光度等)

在這裏插入圖片描述

光照具有局部性(Shading is Local)

沒有陰影會產生 (Shading != Shadow)

在這裏插入圖片描述

上圖的光源在圖片的左上方,可以看到物體表面上具有反光,還有漫反射,物體的背面爲黑色,但是地板上沒有陰影。這裏的着色能夠得到的效果只有物體表面上的光照效果。

漫反射(Diffuse Reflection)

光照在射到一個平面上時,會均勻的向四面八方進行反射,我們稱這種反射爲漫反射。
在這裏插入圖片描述

漫反射與觀察者的位置沒有關係,引文漫反射是向四面八方均勻的反射光纖,所以觀察者不管從什麼角度觀察,表面的顏色都是一樣的。

物體接受光線能量的方式

在現實中,將一個物體放在一個光源下,若是物體的角度不同,則物體的明暗也會不一樣。這是爲什麼?
在這裏插入圖片描述

可以看第一幅圖,圖中有六根光線,每一根光線代表着一股能量,如果物體表面和光線垂直的畫,那麼物體可以接收到所有光線的能量,

如果物體表面下旋轉了一定的角度,這是物體表面只接收到了三根光線,所以物體的表面就暗一些。如果要把這種現象推廣到某種理論上去,就是說物體表面的法線和光線的夾角決定了物體表面應該有多亮,這是通過觀測得到的結論。

更科學的解釋是這樣的:首先考慮光是一道能量,這就說明我看到了一個物體就代表着這些物體接收到了一定量的能量。比如說用太陽能板接受太陽光,太陽能板越大,接收到的光照的能量就越多。如果要考慮一個着色點能接受多少能量,那麼就要看這個着色點周圍的單位面積能接受到多少能量,但是着色點周圍的單位面積始終是不變的,那就要考慮法向量和光線的夾角。考慮一下下面的情景:爲什麼地球會有冬天和夏天,並不是因爲夏天離太陽近一些,冬天離太陽遠一些。其實是因爲當北半球在夏天時,太陽對北半球的光線是一個直射的狀態,這個光照幾乎時垂直北半球,這就說明夏天和冬天區別就是看光線是否垂直於我們所處的地球表面,這也就解釋了爲什麼北半球是夏天時,而南半球是冬天,當光線直射北半球的時候,就不能直射南半球,南半球單位面積接收的光線的能量也就更少。

所以在圖形學中,一個着色點附近的單位面積接受到的光線的能量是和光線的入射方向有關的。計算從不同角度接受到的光線能量有一個

Lambert’s cosine law(蘭伯特餘弦定理)。這個定理是說,接收到的光線的能量和 cos(光線的方向,着色點的法向量)的值 成正比。

當光線垂直於物體表面時,物體表面所能夠接收到的光線的能量最大,而當光線垂直於物體的表面的法向量時,物體表面就不能接收到光線的能量,也就會非常暗。

光衰減(Light Falloff)

設想一下我們有一個如下圖所示的點光源,朝四面八方發射光能量。
在這裏插入圖片描述

我們假設上圖中的光是在真空中傳播,光在傳播過程中沒有能量的損失。我們以球殼的方式來表現光向外發射能量的過程,即在某一時間點上,所有光線的終點可以圍城一個球體。

由於光線在傳播過程中沒有能量損失,那麼在每一個球殼上的能量的大小應該是相同的,即在靠近光源的一個小的球殼上所包含的光的能量應該是和外面的大的球殼上所包含的光的能量是相同的。

按照途中所示,我們假設在半徑爲1的這個球殼上所蘊含的能量爲k,而在這個球殼上的每一點的光的強度是I,那麼在半徑爲r的球殼上,在這個球殼上的光線的強度就應該是 I/(r*r)。

所以這就解釋了爲什麼距離越遠,光照的強度越弱。

漫反射的強度計算(Lambertian (Diffuse) Shading)

給定一個點光源,光線的方向向量I,着色點表面的法向量n,觀察者的方向向量v,光線的入射角度θ,計算的方法如下:
在這裏插入圖片描述

我們之前已經得到:

  • 着色點接受能量大小和 cos<I , n>的值成正比
  • 光的強度在空間中的衰減程度

在這裏插入圖片描述

這兩個相乘得到的就是 光線照射到着色點上時,着色點周圍的單位面積所接收到的能量。至於這裏的max函數的解釋:因爲當I和n的方向相反時,得到的結果爲負數,這是什麼意思,就是說光線穿過了物體
在這裏插入圖片描述

kd是一個係數,代表的是一個物體本身的顏色,或者是材質。因爲不同的材質和光線作用的結果不同,所以還要再×這個係數。

在這裏插入圖片描述

漫反射的效果,kd從左往右依次增大

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章