pos機(jī)原理圖,光照模型的原理和實現(xiàn)思路——Phong

 新聞資訊2  |   2023-06-07 09:17  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于pos機(jī)原理圖,光照模型的原理和實現(xiàn)思路——Phong的知識,也有很多人為大家解答關(guān)于pos機(jī)原理圖的問題,今天pos機(jī)之家(m.dsth100338.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機(jī)原理圖

pos機(jī)原理圖

Phong光照模型

之前說過,游戲場景中計算光照時,需要考慮光源、模型材質(zhì)和觀察方向三方面的因素。很多物理學(xué)家、數(shù)學(xué)家根據(jù)這些因素,再結(jié)合真實物理世界光照效果的經(jīng)驗,總結(jié)出幾種非常經(jīng)典的光照模型,比如說蘭伯特(Lambert)、環(huán)境光(Ambient)、Phong、Blinn-Phong、PBR等等,其中最經(jīng)典的要數(shù)Phong光照模型。

Phong光照模型是由著名學(xué)者裴祥風(fēng)在1975年提出的第一個有巨大影響力的光照計算模型。這個模型只考慮物體對直接光照的反射作用,認(rèn)為環(huán)境光是常量,沒有考慮物體之間相互的反射光,物體間的反射光只用環(huán)境光表示。用一個簡單的公式來表示,就是:

光照 = 漫反射(Diffuse) + 高光反射(Specular) + 環(huán)境光(Ambient)

漫反射

漫反射用來描述,當(dāng)光線從光源照射到模型表面時,該表面會向每個方向散射多少輻射量。**漫反射光線的強(qiáng)度與物體表面的法線和光源方向之間夾角的余弦值成正比。**這部分可以通過光源照射方向和法線方向的點積來實現(xiàn)。漫反射光的計算公式可以寫成:

其中,normalDir表示法線方向,lightDir表示光源方向,為了防止點積為負(fù)數(shù),因此使用max函數(shù)將其截取到0,這樣可以防止物體被后面來的光源照亮。C-light表示光源顏色,m-light表示材質(zhì)的漫反射顏色。

法線方向可以通過下面的公式計算得出:

// v表示頂點normalDir = normalize(mul(float4(v.normal,0.0),Unity_WorldToObject).xyz);

光源方向通過使用Unity內(nèi)置的變量_WorldSpaceLightPos0計算獲取,不過這里涉及到光源類型問題,如果是平行光源,直接將_WorldSpaceLightPos0變量歸一化,就能得到光源方向;但如果是點光源,還需要再減去頂點的世界空間坐標(biāo)位置,然后再歸一化獲取光源方向。

//i.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;// v表示頂點// 獲取平行光、點光源方向#if defined (DIRECTIONAL)half3 light_dir = normalize(_WorldSpaceLightPos0.xyz);#elif defined (POINT)half3 light_dir = normalize(_WorldSpaceLightPos0.xyz - i.pos_world);#endif

除了使用max()函數(shù)截取點積結(jié)果,使用saturate()函數(shù)也可以達(dá)到同樣的效果。

接下來是C-light光源顏色,光源顏色使用內(nèi)置變量_LightColor0獲取,不過在此之前,還需要引入內(nèi)置文件“AutoLight.cginc”

最后是M-light材質(zhì)顏色,直接可以通過材質(zhì)紋理獲取。

知道了上述參數(shù)的計算或獲取方法,就能計算出漫反射顏色了,不過還有一個問題沒有考慮,那就是光的衰減。

平行光通常是用來模擬自然界的太陽光,因為太陽光有很高的強(qiáng)度,光的衰減幾乎可以忽略不計。而對于點光來說,就必須通過計算物體到光源之間的距離來獲得。具體計算方法如下:

// 計算衰減#if defined (DIRECTIONAL)half attuenation = 1.0; // 衰減系數(shù)#elif defined (POINT)// 計算點光源到物體之間的具體// i.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz;// v表示頂點half distance = length(_WorldSpaceLightPos0.xyz - i.pos_world);// 衰減范圍值half range = 1.0 / unity_WorldToLight[0][0];float attuenation = normalize((range - distance)/range); // 點光源的衰減值#endif

漫反射最終的計算公式為:

half4 base_color = tex2D(_MainTex, i.uv);half3 NdotL = dot(normal_dir,light_dir);// 計算漫反射顏色half3 diffuse_color = max(0.0, NdotL) * _LightColor0.xyz * base_color.xyz * attuenation;高光反射

這里的高光反射是一種經(jīng)驗?zāi)P停⒉煌耆险鎸嵨锢硎澜缰械母吖夥瓷洮F(xiàn)象。當(dāng)一束光線照射到物體上時,光線會沿著物體表面法線防線朝著和入射方向相反的方向反射,這種反射的光線,可以讓物體看起來更加有光澤。

另外,高光反射還和攝像機(jī)的觀察方向有關(guān),從不同的角度觀察物體,物體的高光反射也是不一樣的,高光反射的計算公式是:

reflectDir表示反射方向,viewDir表示攝像機(jī)的觀察方向,C-light表示光源顏色。

反射方向使用reflect()函數(shù),傳入光源負(fù)方向和法線方向,具體代碼如下:

half3 reflect_dir = reflect(-light_dir, normal_dir);

觀察方向通過攝像機(jī)世界空間坐標(biāo)位置減去頂點世界空間位置計算得出,具體代碼如下:

half3 view_dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);

高光反射的計算代碼如下:

half3 view_dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);half3 reflect_dir = reflect(-light_dir, normal_dir);half RdotV = dot(reflect_dir,view_dir);half3 spec_color = max(0.0,RdotV) * _LightColor0.xyz;

這個高光計算的代碼還是屬于簡單版的,大家可以引入其他變量,比如反光度(shininess)、高光強(qiáng)度(specIntensity)、高光遮罩(specMask)等等,靈活控制高光反射的效果。

half3 spec_color = pow(max(0.0,RdotV),_Shininess) * _LightColor0.xyz * _SpecIntensity * spec_mask.rgb;環(huán)境光

最后一步的添加環(huán)境光,環(huán)境光相對來說就非常簡單了,可以使用純色,或者使用一張紋理貼圖來制作。

Phong光照模型最后的計算結(jié)果是

half3 phong_color = diffuse_color + spec_color + _AmbientColor.xyz;總結(jié)

上述漫反射、高光反射和環(huán)境光的計算屬于簡易版本,實際在編寫shader中,還可以加入更多參數(shù)實現(xiàn)更復(fù)雜精確的控制效果,比如說混入顏色貼圖、粗糙圖貼圖、法線貼圖。

另外,需要提醒的是:任何光照模型的計算,都需要根據(jù)渲染路徑的思路來進(jìn)行計算,具體思路請參考Unity中的渲染路徑RenderingPath,下面給出一個光照模型shader Pass的模板:

Shader "lit/Phong"{ SubShader { Tags {"RenderType"="Opaque"} Pass { Tags { "LightMode"="ForwardBase" } CGPROGRAM #pragma multi_compile_fwdbase #include "AutoLight.cginc" } Pass { Tags { "LightMode"="ForwardAdd" } Blend One One CGPROGRAM #pragma multi_compile_fwdadd #include "AutoLight.cginc" ENDCG } }}

以前向渲染路徑為例,它使用到了兩個Pass,一個是ForwardBase,另外一個是ForwardAdd,因此在Tags 中要將這兩個Pass名稱傳入到LightMode。

初次之外,還需要分別添加multi_compile_fwdbase 和 multi_compile_fwdadd。

另外,還需要再引入AutoLight.cginc內(nèi)置文件,這個文件包含了許多光源計算的內(nèi)置變量。

以上就是關(guān)于pos機(jī)原理圖,光照模型的原理和實現(xiàn)思路——Phong的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機(jī)原理圖的知識,希望能夠幫助到大家!

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://m.dsth100338.com/newsone/64197.html

你可能會喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。