最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Games101-lecture 07.08 著色

2022-07-26 17:48 作者:云長梧  | 我要投稿

零、提綱

(1) 可見性/遮擋

? ? ?Z-Buffer算法(深度緩存)

(2)?著色

? ? ?著色和光照

? ? ?著色頻率

? ? ?圖形渲染管線

? ? ?shader?program+GPU

? ? ?Texture Mapping?

一、深度緩存 Z-Buffer算法

? ? ?前面只考慮了一個三角形的繪制,但是當(dāng)多個三角形重疊在一起時,如果繪制出正確的圖像。這就涉及到深度緩存。

? ? 1. 畫家算法:從后往前畫

? ? ? ? ?步驟:先繪制最遠處的物體,然后逐步繪制近處的物體,由于近處會自動覆蓋遠處物體,因此能得到正確的效果。

? ? ? ? 缺點:

? ? ? ? ? ? ? ?1.在繪制前需要對所有待繪制物體進行排序。排序時間復(fù)雜度O(nlogn)

? ? ? ? ? ? ? ? 2. 無法處理循環(huán)遮擋

循環(huán)遮擋

? ? ? ?2. 深度緩沖解決畫家算法的缺點

? ? ? ? 分析角度由三角形變?yōu)橄袼?。從畫家算法中考慮三角形的前后關(guān)系,到Z-buffer中只考慮像素點繪制的前后關(guān)系(只繪制最前面的像素)

? ? ? ? 需要兩個額外空間的支持:

? ? ? ? ?1. frame buffer stores color values(存儲顏色)(buffer大小與屏幕大小一致)

? ? ? ? ?2. depth buffer stores depth(存儲深度)(buffer大小與屏幕大小一致)

? ? ? ? 深度緩存中的值默認為無窮遠。每當(dāng)確認像素被某個三角形覆蓋時,在更新像素顏色前,先比較當(dāng)前三角形這個點的距離與當(dāng)前像素對應(yīng)位置的depth buffer中的值。如果三角形上點的深度比當(dāng)前值更遠,則直接拋棄。否則,更新frame buffer中該像素的顏色,同時更新depth buffer中該像素的深度。(即通過深度緩存的作用,depth buffer總是記錄最近的深度, frame buffer總是記錄最近的顏色值)

? ? ?注意:我們通常假定 z?總是正的,z代表深度(z越小越近,z越大越遠)

z-buffer 算法

? ? ? ? ? 另:Z-buffer算法與繪制順序沒有關(guān)系

如圖:如果深度相同則不處理,也就是說如果像素深度相同,保留原先的像素。

二、著色 Shading

? ? 著色的目的是引入明暗與不同的顏色。在這門課中指對不同的物體引入不同的材質(zhì) (material) 。

? ? 著色只考慮局部點自身的光照效果,與場景中其他點的光照效果無關(guān)。因此著色本質(zhì)局部光照(區(qū)分全局光照),也不會產(chǎn)生陰影。

? ? ?注:全局光照(Global illumination)是間接光照,指是被反射過來的光照,考慮到環(huán)境中所有表面和光源相互作用的照射效果

? ? ? ? ? ??局部光照(local illumation)?簡單說就是只考慮光源到模型表面的照射效果,而不考慮其他點反射的效果


? ? ? 1.?基本著色模型(局部光照模型):blinn-phong?reflectance model(blinn-phong反射模型)

? ? ? ? specular highlights??+? Diffuse reflection? +? Ambient lighting (高光+漫反射+環(huán)境光照)

? ? ? ?

blinn-phong模型的組成

? ? ? 2.泛光模型(Ambient lighting環(huán)境光)

? ? ? 第一個, 泛光模型即只考慮環(huán)境光,這是最簡單的經(jīng)驗模型,只會去考慮環(huán)境光的影響,環(huán)境光與觀察、與法向都沒關(guān)系,實際上就是一個常數(shù)。并且不會去精確的描述,而只是用一個簡單的式子表示

La是常數(shù)

其中

代表物體表面對環(huán)境光的反射率
代表入射環(huán)境光的亮度
用來存儲結(jié)果,即人眼所能看到從物體表面反射的環(huán)境光的亮度

tips:其中反射率還是光的亮度都是一個3維的RGB向量,為什么一個物體能夠有顏色,其實就是它吸收了一定顏色的光,將剩下的光反射出來,也就有了顏色

效果如下:

? ? ?3.Lambert漫反射模型

? ? ?Lambert漫反射模型是在泛光模型的基礎(chǔ)之上增加了漫反射項。漫反射便是光從一定角度入射之后從入射點向四面八方反射,且每個不同方向反射的光的強度相等,而產(chǎn)生漫反射的原因是物體表面的粗糙,導(dǎo)致了這種物理現(xiàn)象的發(fā)生。

  • 首先應(yīng)該考慮入射的角度所造成的接收到光強的損失

?只有當(dāng)入射光線與平面垂直的時候才能完整的接受所有光的能量,而入射角度越傾斜損失的能量越大。我們應(yīng)該將光強乘上一個入射角度。

其中l(wèi)是入射光方向,n為平面法線方向
  • 再考慮光源與照射點的距離

圖中中心為一個點光源,光線均勻的向周圍發(fā)射,可以想象光源發(fā)射出來的能量其實是一定的,那么在任意兩個圈上接受到的能量之和一定相等。而離圓心越遠,圓的面積越大,單位面積所接受能量也就越弱,因此光強 I 要除以?r的平方。

漫反射的光強與兩個參數(shù)有關(guān)。一是光線的強度、二是入射光與交點處法向的角度大小?

漫反射計算公式

其中 Kd?為漫反射系數(shù),I 入射光強,n,l 分別如圖中所示為法線向量和入射方向(由觀察點指向光源),max是為了剔除夾角大于90°的光,v?是觀察方向(由觀察點指向相機)。 注意漫反射光線強度是與出射方向無關(guān)的,因此無論人眼在哪觀察接收到的強度都是一樣的!

tips:通過改變漫反射模型的3維反射系數(shù) Kd?,我們就能夠得到物體表面不同的亮度或顏色

漫反射表現(xiàn)
使用a specific shading point?是為了方便后續(xù)計算

將環(huán)境光與漫反射一起考慮之后(Lambert模型):

? ? 4.Phong反射模型

? ? 看見高光的條件:當(dāng)觀察方向 V 與反射光線 R 越接近時,高光越明顯

高光亮度計算公式

其中ks為鏡面反射系數(shù),I為入射光強,r為光源到入射點距離,注意這里在max剔除大于90°的光之后,夾角?α 是觀察方向和反射光線的夾角,我們還乘了一個指數(shù)p,添加該項的原因很直接,因為離反射光越遠就越不應(yīng)該看見反射光,需要一個指數(shù)p加速衰減


p?衰減效果

最后我們把環(huán)境光,漫反射光,鏡面反射光全部累加得到Phong模型效果:

? ? 5.Blinn-Phong反射模型

? ??Blinn-Phong反射模型是對phong模型計算反射方向與人眼觀察方向角度的一個優(yōu)化!

如果觀察方向與反射方向角度大于90度,則根據(jù)公式會看不到高光。與實際不符合。使用半程向量可以避免這種情況,并且大大加速了角度計算的速度。

如上文所提,我們將反射方向與人眼觀察方向夾角替換成一個半程向量和法線向量的夾角

半程向量?h ,為入射方向?l?與觀察方向?v?的角平分方向

tips:反射向量可由入射方向在法線方向投影的兩倍減去入射方向得出

整體計算公式:

二、著色頻率

? ??在上文中我們講解完了局部光照模型,其中主要利用了觀察方向,入射光線與法線向量的位置關(guān)系,但并沒有具體說究竟是三角形面的法線向量還是三角形頂點的法線向量,這也就牽扯出了本章內(nèi)容——著色頻率(面著色,頂點著色,像素著色),這3種不同的著色頻率其實也就對應(yīng)了三種不同方法。

分別為 Flat Shading + Gouraud Shading + Phong Shading (Phong Shading不是Phong反射? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?模型)

著色頻率不同導(dǎo)致的不同效果

? ??

模型精度提升,phong著色不一定比flat著色更耗時

? ? 1.Flat Shading

? ??面著色以每一個面作為一個著色單位。模型數(shù)據(jù)大多以很多個三角面進行存儲,因此也就記錄了每個面的法線向量,利用每個面的法線向量進行一次Blinn-Phong反射光照模型的計算,將該顏色賦予整個面,效果如下:

Flat Shading

? ? 2.Gouraud Shading

? ??Gouraud Shading會對每個三角形的頂點進行一次著色,原先我們只有每個面的法線向量,將所有共享這個點的面的法線向量加起來求均值,再標(biāo)準(zhǔn)化就得到了該頂點的法線向量,有了每個三角形的頂點向量之后,自然就可以計算出每個頂點的顏色。

對于三角形內(nèi)部的每一個點用重心坐標(biāo)(后面會講到)來插值

其中?c0,c1,c2?為三角形三個頂點的顏色,α,β,γ?為三角形面內(nèi)一點的重心坐標(biāo),c?為該點的插值之后得到的顏色。

這樣就能成功的得到每一個點的顏色了,效果如下:

(tips:1.這里有兩個tips可以注意一下,首先重心坐標(biāo)一定要是原世界坐標(biāo)空間中的重心坐標(biāo),但實際計算中一般會使用投影之后的二維平面來計算重心坐標(biāo),存在著一個誤差需要校正——透視矯正插值,這會在下一節(jié)筆記中展開來談(zhihu孫小磊的筆記6)。 2. 第二點,其實按理來說Gouraud用的是雙線性插值(會在之后的貝塞爾曲線中具體講解),但是道理都是相同的,本文這里為了方便就直接用了重心坐標(biāo)插值)

? ??3.Phong Shading

以上只對每個三角形頂點進行了著色,其它的顏色都是通過插值得到,

而Phong Shading可以真正的對每個點用Blinn-Phong模型計算得出顏色

以上步驟只得到每個頂點的法線向量,而Phong Shading需要的三角形內(nèi)部的每一個點的法線向量也可以像插值顏色一般得到:


其中?n0,n1,n2?分別是三角形三個頂點的法線向量,α,β,γ為三角形面內(nèi)一點的重心坐標(biāo),n?為該點插值之后得到的法線向量。如此便得到了任意一點的法線向量了,也當(dāng)然可以對任意一點進行Blinn-Phong模型的計算了。最終對比渲染效果如下:

三、渲染管線(流程)

三維頂點 -> mvp變換 ->?光柵化 ->?著色

1.先將點繪制在三維空間中,

2.3.然后將三維空間的點投影在平面上,這些點會形成三角形? ?

4.由于屏幕是離散的,要將三角形畫在屏幕上就要使用光柵化離散成像素(片元)

5.像素進行著色

6.Framebuffer的處理,就是將所有的像素顏色信息整合在一起,輸送給顯示設(shè)備加以顯示。

頂點處理的作用是指對所有的頂點數(shù)據(jù)進行Model,View,和Projection的變換,最終得到投影到二維平面的坐標(biāo)信息(同時為了Zbuffer保留深度z值),當(dāng)然如果超出觀察空間的會被剪裁掉。

三角形處理也十分容易理解,就是將所有的頂點按照原幾何信息,變成三角面,每個面由3個頂點組成。


光柵化

光柵化過程中進行采樣(判斷像素是否在三角形內(nèi)部),深度測試(Z-Buffer),知道了哪些在三角形內(nèi)的點可以被顯示。

著色(片元處理+頂點處理+Z-Buffer)

tips:其實在片元處理階段有一點還未敘述,我們也可以去做texture mapping,利用texture的信息來代替blinn-phong模型漫反射系數(shù)來當(dāng)作顏色。

四、shader program與GPU

shader program分兩種,分別是對頂點以及對片元的處理

(分別命名為vertex?shader,fragment?shader),程序員可以自行編程來代替原來固定的頂點處理和片元處理從而達到各種各樣令人驚嘆的效果!這也就是現(xiàn)在的可編程渲染管線。

shader程序是對每一個頂點或像素編寫通用的模板,也就是說寫一個shader程序,使每一個頂點或片元都按照shader程序來執(zhí)行。

片元shader示例?

GPU是計算機圖形軟件的硬件實現(xiàn),在硬件上就實現(xiàn)了 mvp 變換和光柵化,著色器是可編程的,并且隨著GPU的發(fā)展,有越來越多不同種類的著色器,不只頂點/片元著色器。

五、紋理映射 texture mapping

紋理可以理解為給每個點賦值不同的光照系數(shù)(也就是blinn-phong中的ka\kd\ks),這樣物體就有了花紋。

1. 紋理坐標(biāo)

? ? ? ? 模型(3D)上的任意三角形上的點,都對應(yīng)著紋理(2D image)上的一個位置,而這個位置就是由紋理坐標(biāo)標(biāo)識的(可以只標(biāo)識三角形的三個頂點,其內(nèi)部紋理坐標(biāo)可以通過插值計算出)

每個三角形頂點都對應(yīng)texture的坐標(biāo)(u,v)

其中texture的坐標(biāo)(u,v),不管texture是長方形還是什么形,u,v范圍都是【0,1】 * 【0,1】

知道了每個三角形頂點對應(yīng)texture的顏色,那怎樣判斷三角形內(nèi)部的插值呢?用重心坐標(biāo)

紋理和著色之間的關(guān)系:紋理是用來定義著色的時候各個不同的屬性,如果不希望著色的時候每個頂點都以相同的方式來著色,就用紋理來改變

Games101-lecture 07.08 著色的評論 (共 條)

分享到微博請遵守國家法律
南投县| 洛隆县| 舒兰市| 新化县| 丰原市| 靖安县| 浦县| 石家庄市| 南开区| 中宁县| 枣庄市| 星座| 南靖县| 黄平县| 陵水| 平顺县| 廉江市| 巴林左旗| 元谋县| 神池县| 开江县| 靖州| 台湾省| 周口市| 曲阜市| 越西县| 荔波县| 札达县| 天津市| 泰来县| 荥经县| 黎城县| 峡江县| 建水县| 四会市| 潜江市| 子洲县| 柯坪县| 开原市| 将乐县| 博兴县|