溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

發(fā)布時(shí)間:2021-11-15 16:14:58 來源:億速云 閱讀:165 作者:柒染 欄目:大數(shù)據(jù)

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

一般計(jì)算機(jī)圖形學(xué)在講解光照理論[1]時(shí)都是如下的順序。雖說都是過時(shí)了的技術(shù),但是你們fashion的PBR還是以這些老祖宗為基礎(chǔ)的。魔改的時(shí)候,請(qǐng)注意這些是骨頭動(dòng)不了。

1.1 Shading 著色方式

1.1.1 Flat shading平面著色

這是渲染一個(gè)材質(zhì)表面最簡(jiǎn)單高效的方式。每個(gè)面使用單個(gè)顏色來表現(xiàn). 在Unity中并沒有實(shí)現(xiàn)這種著色方式,你需要自己動(dòng)手寫一個(gè)簡(jiǎn)單的CG shader。如果你要的是lowpoly那種效果的話,記得別用光滑組,按三角面給出頂點(diǎn)法線。

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

1.1.2 Gouraud shading 哥羅德著色

哥羅德著色方式被引入圖形學(xué)用于提升顏色在光滑物體上的自然過渡。該方式計(jì)算每個(gè)模型頂點(diǎn)的光色,然后將光色插值到頂點(diǎn)所在的三角面.

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

這樣的方式顯然會(huì)比逐像素計(jì)算光色來的高效,但是由于大部分的材質(zhì)并不只有漫反射,還有鏡面反射,而鏡面反射大都發(fā)生在多邊形內(nèi)部并非頂點(diǎn)上,所以該方式在表現(xiàn)具有細(xì)節(jié)高光的物體時(shí)顯得非常糟糕.

Unity 自帶VertexLit shader使用的該著色方式,請(qǐng)右鍵你的shader文件,在inspector中查看生成后的shader代碼中的frag函數(shù)。

1.1.3 Phong shading 旁氏著色

如上所說大部分的材質(zhì)表面并不是只有漫反射,還有高光反射。為了表現(xiàn)材質(zhì)高光,旁氏著色被引入渲染方法中。在渲染多邊形中的某一個(gè)點(diǎn)時(shí),該點(diǎn)的法線為相鄰頂點(diǎn)法線的插值。光色逐點(diǎn)計(jì)算.

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

這能非常完美地表現(xiàn)一個(gè)球體,因?yàn)榉ň€的插值正是符合球體的法線分布規(guī)律。

UNITY surface shader默認(rèn)使用Phong shading,請(qǐng)右鍵你的mobile diffuse shader,在inspector中查看生成后的surf shader代碼中的frag函數(shù)。

1.2 Lambert Lighting Model

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

漫反射材質(zhì)的特性是進(jìn)入表面的入射光線會(huì)從一個(gè)隨機(jī)方向反射出去。你可以把這個(gè)過程想象成為一個(gè)原子會(huì)吸收一部分光子后向另外一個(gè)方向發(fā)射另外一個(gè)光子,由于光反射方向的隨機(jī)性,我們的觀察角度變得不那么重要,唯一需要關(guān)注的就是光從什么方向進(jìn)入這個(gè)材質(zhì)表面。

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)
如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

如果光從一個(gè)更接近垂直的角度進(jìn)入表面,意味著更密集的光能量到達(dá)了材質(zhì)表面。如果光從一個(gè)斜視的角度進(jìn)入材質(zhì),同樣多的光能量會(huì)覆蓋更大的區(qū)域而單位表面接受到的光能量更少一些.如圖所示,材質(zhì)表面接收到的光能量以及它能反射出去的量 是與材質(zhì)表面以及光方向之間的夾角成比例的。

這就是為什么我們需要材質(zhì)表面的法線向量。法線與光方向夾角的余弦值決定了我們需要的照明比例。

在Unity中我們可以找到Lambert Lighting的實(shí)現(xiàn)如下:

//Shader代碼 from Lighting.cgin
fixed diff = max (0, dot (input.Normal, light.dir));
fixed4 output;
output.rgb = s.Albedo * light.color * diff;

1.3 Phong Lighting Model

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

正如我們之前提到的,材質(zhì)表面并不僅僅只有漫反射,現(xiàn)實(shí)中的物體表面都會(huì)有一部分鏡面反射,即部分入射光線會(huì)從反射方向射出。如果材質(zhì)的觀察者正好從反射角度來觀察材質(zhì),會(huì)發(fā)現(xiàn)材質(zhì)表面的一個(gè)區(qū)域會(huì)比其他區(qū)域更亮一些。注意觀察者的位置是不變的。觀察者可以選擇觀察材質(zhì)表面的不同區(qū)域,但是高光反射只會(huì)出現(xiàn)在反射光線直射到觀察者的區(qū)域。這樣,一部分光被材質(zhì)表面吸收并反射到了任意方向,而另一部分直接反射出表面,如果這個(gè)直接反射的部分為100%,那么這個(gè)表面就是一個(gè)理想鏡面了.

我們?nèi)耘f可以使用觀察方向和光線的反射方向的余弦值來定義這個(gè)光照模型,但是,由于余弦函數(shù)衰減得太慢,它在材質(zhì)表面呈現(xiàn)的是一個(gè)大而松散的高光。Phong提議使用余弦值的n次冪來快速衰減余弦值,且不會(huì)影響函數(shù)0~1的值域,這個(gè)次冪在程序圈里被叫做shininess。由于計(jì)算量相比Blinn-Phong更大,Unity的默認(rèn)shader中并沒有使用該光照模型,當(dāng)然你自己魔改一下也可以,高光點(diǎn)的位置會(huì)稍微有區(qū)別,不過,別杠行不?

1.4 Blinn-Phong Lighting Model

更接近真實(shí)世界的光照模型其實(shí)是Blinn-Phong模型,它計(jì)算高光的方式有些許的不同。在Blinn-Phong模型中,我們使用的是光的入射向量與觀察方向之和與材質(zhì)表面法線的余弦值來衡量照明效果,從圖中可以看到,在光的反射方向與觀察方向重合時(shí),該向量與法線方向重合,余弦值為1,感受到最強(qiáng)的光,理論自洽沒毛病。

如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)

其他的一切不變,在Unity中的實(shí)現(xiàn)如下

//Shader代碼 from Lighting.cginc
half3 h = normalize (light.dir + viewDir);
fixed diff = max (0, dot (s.Normal, light.dir));
float nh = max (0, dot (s.Normal, h));
float spec = pow (nh, s.Specular*128.0) * s.Gloss;
fixed4 c;
c.rgb = s.Albedo * light.color * diff + light.color * _SpecColor.rgb * spec;

看完上述內(nèi)容,你們掌握如何進(jìn)行圖形學(xué)基礎(chǔ)光照對(duì)照Unity實(shí)現(xiàn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI