基本光照模型

2021-10-02 09:43:41 字數 2747 閱讀 7240

基本方法是把進入攝像機的光線分成4個部分,每個部分分別有一種分發來計算其貢獻度

自發光(emissive):物體本身產生的光

高光反射(specular):光線從光源照到物體表面反射到眼睛裡的光

漫反射(diffuse):這個部分是光線從光源照到物體表面時,物體向各個方向產生的光。

環境光(ambient):這個部分用來描述其他間接的光。我覺的可以理解成整體的乙個基礎顏色

通常用乙個顏色常量表示整體的自發光顏色,或者是取樣一張自發光貼圖再乘以乙個自發光係數

分為phong模型和blinn-phong模型,分別是左圖和右圖。計算高光反射需要知道表面法線、視角方向、光源方向、反射方向

phong模型**

float3 r = 2 * dot(normal, clightdir) * normal - clightdir;

float3 v = normalize(ccamerapos - worldpos);

float specular = pow(max(dot(v, r), 0.0), cgloss);

float3 specularcolor = clightcolor * cspecularcolor * specular;

blinn-phong模型**

float3 v = normalize(ccamerapos - worldpos);

float3 h = normalize(v + clightdir);

float specular = pow(max(dot(normal, h), 0.0), cgloss);

float3 specularcolor = clightcolor * cspecularcolor * specular;

和上面的phong模型相比,blinn模型避免了反射方向r的計算,而是引入了乙個新的向量h。相比於計算向量r計算向量h的運算更少,所以現在比較常用的是blinn-phong模型

一般做法是先取樣diffuse貼圖,然後根據是否有透貼的需求,對alpha小於某個值(例如0.5),認為是透明的,進行裁剪。然後進行光照計算

float4 diffuse = tdiffuse.sample(sdiffuse, itexcoord.xy);

#ifdef alphamask

if (diffuse .a < 0.5)

discard;

#endif

float4 diffcolor = cdiffcolor * diffuse;

float diff = max(dot(inormal, clightdir), 0.0);

float4 diffusecolor = clightcolor * diffcolor * diff;

通常用乙個顏色常量表示環境光

color = emissivecolor + specularcolor + diffusecolor + cambientcolor;
逐頂點光照模型也就是我們常說的高洛德著色(gouraud shading),而逐畫素光照模型則是phong著色(phong shading)兩者計算公式其實都是一樣的用的上面說的這套計算公式,區別就是乙個在頂點著色器裡計算,另乙個在畫素著色器裡計算。由於畫素個數遠比頂點個數多得多,所以gourand著色效能要明顯優於phong著色。但是phong效果要優於gouraud,因為如果是gouraud,頂點著色器計算完之後畫素著色器裡拿到的顏色是插值之後的顏色。試想一下乙個三角面上的乙個畫素,由3個頂點插值得出最終顏色。而phong著色在畫素著色器裡計算的,可以每個畫素根據插值下來的uv去取樣貼圖,這樣結果比較精準。

舉個例子,就好比乙個有序的整型陣列,畫素就好比陣列裡的第幾個元素。gouraud著色就好比,知道第幾個元素以及陣列長度,然後根據最大值和最小值算一下,value = min + (max - min) * index / length; 而phong著色,則是直接拿index在陣列中對應的元素,如value = nums[index];

此外,與它們平級的還有乙個逐多邊形著色(flat shading),對整個三角形只計算一次光照值。通常計算光照的位置為三角形中心,表面法向量為三角形法向量。使用flat著色,物體由多邊形構成的本質表露無遺,沒有任何光澤可言,所以也基本沒人用。

toon著色(也叫celshading,**著色)是一種非相片感的著色技術,常常被用來模擬手繪風格。它的乙個特點就是顏色層次比較明顯。

做法就是將計算diffuse用到的余弦值(dot(normal,lightdir),等價於normal和lightdir夾角的余弦值),對映到幾個固定值。例如值為[0,0.25)的對映成0,[0.25,0.5)對映成0.25,[0.5,0.75)對映成0.5,[0.75,1.0)對映成0.75。這樣的話,光照結果就會出現一層層的感覺。

通過下面公式進行對映

cosine = floor( cosine * 4) * 0.25;

基本光照模型簡單實現

lambert光照模型,根據光照向量與頂點法線的夾角來確定光照強度 upgrade note replaced mul unity matrix mvp,with unityobjecttoclippos shader james lambert subshader cgprogram pragma...

簡單光照模型(Lambert 光照模型)

環境光是對光照現像的最簡單抽象,因而侷限性很大。它僅能描述光線在空間中無方向並均勻散布時的狀態。很多情況下,入射光是帶有方向的,比如典型的陽光。如果光照射到比較粗糙的物體表面,如粉筆,由於這些表面從各個方向等強度地反射光,因而從各個視角出發,物體表面呈現相同的亮度,所看到的物體表面某點的明暗程度不隨...

8 光照模型 蘭伯特光照模型

光照模型就是乙個公式,使用這個公式來計算在某個點的光照效果。標準光照模型 在標準光照模型裡,我們把進入攝像機的光分為下面幾個部分 自發光 self luminous 如螢火蟲 高光反射 specular 漫反射 diffuse 向量點乘和叉乘 點乘 標量 代表a在b上的投影和b的乘積 a b a b...