phong著色.docx_第1頁
phong著色.docx_第2頁
phong著色.docx_第3頁
phong著色.docx_第4頁
phong著色.docx_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Phong光照模型的簡(jiǎn)單說明我簡(jiǎn)單地介紹一下Phong光照模型.雖然這種光照模型算是比較古老的,但是通過合適的參數(shù)設(shè)置,仍然可以實(shí)現(xiàn)真實(shí)的效果。我們的目標(biāo)是渲染出以下效果,這里以Doom3的男主角為例(終于不是怪物了.)一般而言,Phong光照模型分為三個(gè)累加階段:漫反射,鏡面反射和環(huán)境光以下按順序說明:1.漫反射(Diffuse)對(duì)于表面比較粗糙的物體,基本表面的明暗就是漫反射效果,比如褲子的材質(zhì)。某一個(gè)象素的明暗系數(shù)只取決于該點(diǎn)與光源的相對(duì)位置,而與眼睛的位置無關(guān)。diffuse_color = base_map * ( N * V_L )* mat_diffuse * light_diffuse;上式中base_map代表該點(diǎn)的基礎(chǔ)顏色,一般通過紋理索引;N 是該點(diǎn)的法線;V_L是該點(diǎn)到光源方向的單位向量;N * V_L 即兩者的點(diǎn)積,注意需要用max( ( N * V_L ), 0 ),因?yàn)樨?fù)的值是沒有意義的;mat_diffuse和light_diffuse分別是材質(zhì)和光源的漫反射系數(shù),用來宏觀調(diào)制漫反射的顏色。下圖是只有N * V_L 項(xiàng)的渲染結(jié)果:2.鏡面反射(Specular)盡管漫反射已經(jīng)可以很好地表達(dá)光照,但是由于它是與視點(diǎn)無關(guān)的,所以多少有些欠缺生動(dòng),而鏡面反射是視點(diǎn)相關(guān)的,所以會(huì)隨著眼睛位置的變化而“流動(dòng)”。specular_color = pow( v_e * v_l, gloss ) * mat_specular * light_specular;這里解釋一下:v_e 是e_v的反射向量(v_e = reflect( e_v, n ) ),而e_v是眼睛到該點(diǎn)的單位向量,所謂反射向量,即以與該點(diǎn)的法線所垂直的平面做鏡面反射所得到的向量(雖然按照原理來說,應(yīng)該是光線反射,而非視線反射.都沒有問題吧);v_l是該點(diǎn)到光源的單位向量;v_e * v_l 是兩者的點(diǎn)積, 同樣要用max(v_e * v_l, 0),負(fù)的值也是不需要的;pow是冪積,點(diǎn)積是底,gloss是指數(shù);gloss用來調(diào)制亮斑的大小,一般來說,gloss越大,光斑越細(xì)小,gloss越小,光斑分布越寬泛。mat_specular,light_specular分別是材質(zhì)和光源的鏡面反射系數(shù),用來宏觀調(diào)制鏡面反射的顏色。注意不是點(diǎn)乘,而是各項(xiàng)分別相乘,就是所謂的調(diào)制.下圖是只有鏡面反射系數(shù)的渲染結(jié)果:3.環(huán)境光(ambient)光照不到的地方是不是就是全黑的呢,對(duì)于受空氣散射影響比較大的環(huán)境來說不是的(比如說室外環(huán)境),這里只是簡(jiǎn)單的對(duì)base_map調(diào)制了一下:ambient_color = base_map * mat_amvient * light_ambient;4.累加(accumulate)最后就是將他們相加了:result_color = diffuse_color + specular_color + ambient_color;5.其他(1)在以上式中所使用的法線是由各頂點(diǎn)的法線插值得到的,我們可以使用法線貼圖來編碼各點(diǎn)的實(shí)際法線值,以獲得更細(xì)致的表面:這里是將一個(gè)法線的三維向量封裝入紋理的RGB分量,另外還涉及一個(gè)世界空間到紋理空間的轉(zhuǎn)換,這里不做描述,因?yàn)槲业膶?shí)際做法是錯(cuò)誤的,卻換來正確的結(jié)果,所以.我也不清楚啦.(2)使用一張單獨(dú)的圖來編碼各點(diǎn)的鏡面反射系數(shù),比如有油漆的地方反射較弱,而磨光的地方則反射較強(qiáng)烈(見盔甲部分)(3)以上效果都是利用光照產(chǎn)生的立體錯(cuò)覺,如果失去光照,立體感也將隨之消失。對(duì)于環(huán)境光,我們應(yīng)該有更好的處理方法,如利用虛擬的光源等等。我在該渲染中使用了兩盞燈,產(chǎn)生的效果還不錯(cuò)。(4)說到底,phong模型對(duì)金屬表面渲染很成功,但對(duì)人物表面渲染欠佳,所以才有SSS等等更為先進(jìn)的模型;但另一方面,Phong模型仍然是最基礎(chǔ)和重要的光照模型,當(dāng)初的固定流水線采用的就是它(當(dāng)然鏡面反射略有不同)先這些吧.接下來讓我們看看Phong模型:我們知道,在理想狀況下,鏡面反射后的光之集中在一條線上,因此我們的視線離這條線的距離越近,射入我們眼中的光線就越多,我們看到的光強(qiáng)也就越強(qiáng)。同時(shí),鏡面反射也與物體表面的高光指數(shù)(物體表面光澤程度)有關(guān),其數(shù)值越大,反射后的光線越集中,反之則越分散,這里可能會(huì)有人想:如果將高光指數(shù)設(shè)置的很大,也就是光線極其分散,Phong是否可以用來代替Lambert?我想答案肯定是不行的,原因是漫反射是將光線反射到各個(gè)角度,而鏡面反射即使反射光線再分散,它們依舊被限制在一個(gè)90度的區(qū)域中,因此與漫反射的效果是不一樣的。下面給出公式:I_spec = k_z * I_l(V R)n_s其中:k_z為表面材質(zhì)的鏡面反射系數(shù),n_s是高光指數(shù),V表示頂點(diǎn)到視點(diǎn)的向量,R表示反射光的單位向量。但是在實(shí)際的程序編寫中,我們一般都會(huì)更容易得到入射光線的單位向量L,所以我們最好轉(zhuǎn)換一下公式。設(shè)頂點(diǎn)的單位法向量為N,有公式:R + L = (2N L)N (這里再次提醒一下,L的方向是由頂點(diǎn)指向光源的)由這個(gè)可以推出:R = (2N L)N - L所以模型公式可以變?yōu)椋篒_spec = k_z * I_l(V (2N L)N - L)n_s下面是用Cg語言實(shí)現(xiàn)Phong模型的代碼:/*/*Phone鏡面光照模型,同時(shí)也加入了Lambert漫反射光照模型 */*/struct vertex_In float4 in_Position : POSITION; float4 in_Normal : NORMAL;struct vertex_Out float4 out_Position : POSITION; float4 out_Color : COLOR0;void main_v(vertex_In vertexI, out vertex_Out vertexO, uniform float4*4 modelViewProj, uniform float4*4 worldMatrix, uniform float4*4 worldMatrix_IT, uniform float3 globalAmbient, uniform float3 eyePosition, uniform float3 lightPosition, uniform float3 lightColor, uniform float3 K_d, uniform float3 K_s, uniform float N_s ) vertexO.out_Position = mul(modelViewProj , vertexI.in_Position);/計(jì)算輸出定點(diǎn)位置 float3 worldPosition = mul(worldMatrix , vertexI.in_Position).xyz;/計(jì)算定點(diǎn)世界位置 float3 N = normalize(mul(worldMatrix , vertexI.in_Normal).xyz);/計(jì)算定點(diǎn)法線向量 float3 V = normalize(eyePosition - worldPosition);/計(jì)算定點(diǎn)到視點(diǎn)的方向 float3 L = normalize(lightPosition - worldPosition);/計(jì)算入射光方向 float3 R = normalize(N*max(dot(2*N , L) , 0) - L);/計(jì)算反射光方向 float3 diffuseColor = K_d*globalAmbient + K_d*lightColor*max(dot(N , L) , 0);/計(jì)算漫反射光強(qiáng) float3 specularColor = K_s*lightColor*pow(max(dot(V , R) , 0) , N_s);/計(jì)算鏡面反射光強(qiáng) vertexO.out_Color.rgb = diffuseColor + specularColor; vertexO.out_Color.a = 1;以上代碼只使用了頂點(diǎn)著色程序,因此只對(duì)幾何頂點(diǎn)進(jìn)行渲染,而不對(duì)片段內(nèi)部的點(diǎn)進(jìn)行處理,因此如果用來渲染低精度模型效果會(huì)很不好,因此我們就要再加入片段著色程序。代碼如下:/*/*Phone鏡面光照模型,同時(shí)也加入了Lambert漫反射光照模型*/*/struct vertex_In float4 in_Position : POSITION; float4 in_Normal : NORMAL;struct vertex_Out float4 out_Position : POSITION; float4 out_objecPos : TEXCOORD0; float4 out_objectNormal : TEXCOORD1;void main_v(vertex_In vertexI, vertex_Out vertexO, uniform float4*4 modelViewProj )/頂點(diǎn)著色程序入口 vertexO.out_Position = mul(modelViewProj , vertexI.in_Position);/計(jì)算輸出定點(diǎn)位置 vertexO.out_objectPos = vertexI.in_Position; vertexO.out_objectNormal = vertexI.in_Normal;void main_f(vertex_Out vertexI, out float4 colorO : COLOR, uniform float4*4 worldMatrix, uniform float4*4 worldMatrix_IT, uniform float3 globalAmbient, uniform float3 eyePosition, uniform float3 lightPosition, uniform float3 lightColor, uniform float3 K_d, uniform float3 K_s, uniform float N_s )/片段著色程序入口 float3 worldPos = mul(worldMatrix , vertexI.out_objecPos).xyz;/計(jì)算定點(diǎn)世界位置 float3 N = normalize(mul(worldMatrix , vertexI.out_objectNormal).xyz);/計(jì)算定點(diǎn)法線向量 float3 V = normalize(eyePosition - worldPosition);/計(jì)算定點(diǎn)到視點(diǎn)的方向 float3 L = normalize(lightPosition - worldPosition);/計(jì)算入射光方向 float3 R = normalize(N*max(dot(2*N , L) , 0) - L);/計(jì)算反射光方向 float3 diffuseColor = K_d*globalAmbient + K_d*lightColor*max(dot(N , L) , 0);/計(jì)算漫反射光強(qiáng) float3 specularColor = K_s*lightColor*pow(max(dot(V , R) , 0) , N_s);/計(jì)算鏡面反射光強(qiáng) colorO.rgb = diffuseColor + specularColor; colorO.a = 1;這樣的話程序就會(huì)對(duì)片段中的點(diǎn)也進(jìn)行處理,渲染效果也會(huì)好一些。Phong著色法(Phong shading),是三維電腦圖像的繪圖技巧之一,結(jié)合了多邊形物體表面反射光的亮度,并以特定位置的表面法線作為像素參考值,以插值方式來估計(jì)其他位置像素的色值。這個(gè)方法由美國越南裔學(xué)者裴祥風(fēng)(Bi Tng Phong)發(fā)明,于1973年的博士論文首度發(fā)表。與Gouraud著色法比較,Phong著色法的效果比前者更逼真,但運(yùn)算程序也比前者為復(fù)雜。其原理要從光照和光線的反射講起。光線的反射有兩種極端情況,一種是漫反射,另一種是鏡面反射。取得這兩種反射情況的數(shù)學(xué)公式是不同的。此外,由于我們看到的許多物體表面并沒有受到光源的直接照射,而是受到在周圍環(huán)境中幾經(jīng)反射的光的照射,物體之間復(fù)雜的反射現(xiàn)象也需要以某種方式反映在著色模型里。由此還要引進(jìn)一種環(huán)境光,它照射到場(chǎng)景的所有表面,并被每一個(gè)表面均勻地向所有方向反射。Phong著色模型是將物體表面的光反射看成是環(huán)境光的反射之和與光源直接有關(guān)的漫反射及鏡面反射的組合。從數(shù)學(xué)上講就是將反射的總能量看做是光環(huán)境的強(qiáng)度,點(diǎn)光源的強(qiáng)度乘以三個(gè)不同的系數(shù)后相加的和。這三個(gè)系數(shù)分別是代表物體表面反射環(huán)境光、產(chǎn)生漫反射和產(chǎn)生鏡面反射的能力。為每一個(gè)要知道顏色的點(diǎn)計(jì)算顏色通常需要很高的代價(jià)。這在產(chǎn)生圖像的目的僅僅是瀏覽一下的情況下是沒必要的。為了解決這個(gè)問題,我們只是有選擇的在某些表面點(diǎn)上全面的使用模型公式,然后依靠顏色差值和表面法線向量差值等技術(shù)來為其表面點(diǎn)著色Phong著色法(Phongshading),是三維電腦圖像的繪圖技巧之一,結(jié)合了多邊形物體表面反射光的亮度,并以特定位置的表面法線作為像素參考值,以插值方式來估計(jì)其他位置像素的色值。這個(gè)方法由美國越南裔學(xué)者裴祥風(fēng)(BiTngPhong)發(fā)明,于1973年的哲學(xué)博士論文首度發(fā)表。與Gouraud著色法比較,Phong著色法的效果比前者更逼真,但運(yùn)算程序也比前者為復(fù)雜。其原理要從光照和光線的反射講起。光線的反射有兩種極端情況,一種是漫反射,另一種是鏡面反射。取得這兩種反射情況的數(shù)學(xué)公式是不同的。此外,由于我們看到的許多物體表面并沒有受到光源的直接照射,而是受到在周圍環(huán)境中幾經(jīng)反射的光的照射,物體之間復(fù)雜的反射現(xiàn)象也需要以某種方式反映在著色模型里。由此還要引進(jìn)一種環(huán)境光,它照射到場(chǎng)景的所有表面,并被每一個(gè)表面均勻地向所有方向反射。Phong著色模型是將物體表面的光反射看成是環(huán)境光的反射之和與光源直接有關(guān)的漫反射及鏡面反射的組合。從數(shù)學(xué)上講就是將反射的總能量看做是光環(huán)境的強(qiáng)度,點(diǎn)光源的強(qiáng)度乘以三個(gè)不同的系數(shù)后相加的和。這三個(gè)系數(shù)分別是代表物體表面反射環(huán)境光、產(chǎn)生漫反射和產(chǎn)生鏡面反射的能力。為每一個(gè)要知道顏色的點(diǎn)計(jì)算顏色通常需要很高的代價(jià)。這在產(chǎn)生圖像的目的僅僅是瀏覽一下的情況下是沒必要的。為了解決

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論