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

2021-10-19 11:35:39 字數 1730 閱讀 1303

光照模型就是乙個公式,使用這個公式來計算在某個點的光照效果。

標準光照模型

在標準光照模型裡,我們把進入攝像機的光分為下面幾個部分

自發光(self-luminous)(如螢火蟲)

高光反射(specular)

漫反射(diffuse)

向量點乘和叉乘

點乘:(標量)代表a在b上的投影和b的乘積

a · b = |a| |b| cosθ

叉乘:   (向量)  a和b為鄰邊的平行四邊形的面積

a × b = |a| |b| sinθ

tags    只有定義正確的lightmode才能得到一些unity的內建光照變數

#include 「lighting.cginc」   包含unity內建的檔案,這樣才可以使用unity內建的一些變數

模擬漫反射:

片元函式裡傳進的color值後在頂點函式後進行差值運算傳進來

// upgrade note: replaced '_world2object' with 'unity_worldtoobject'

shader "custom/mydiffuseshader-vert"

subshader

//_lightcolor0 取得第乙個直射光的顏色

//_worldspacelightpos0 第乙個直射光的位置

cgprogram

#include "lighting.cginc"

#pragma vertex vert

#pragma fragment frag

fixed4 _diffuse;

struct a2v

;struct v2f

;v2f vert(a2v i)

float4 frag(v2f i):sv_target

endcg}}

}

這裡有一點是漫反射時候計算的diffuse是物體的顏色和漫反射光的顏色相乘,而最後的環境光卻是相加的

可能環境光的影響更大點把。且可能蓋過主體色,漫反射光則是和主體色相互融合。

//_lightcolor0 取得第乙個直射光的顏色

//_worldspacelightpos0 第乙個直射光的位置

cgprogram

#include "lighting.cginc"

#pragma vertex vert

#pragma fragment frag

fixed4 _diffuse;

struct a2v

;struct v2f

;v2f vert(a2v i)

float4 frag(v2f i):sv_target

endcg}}

}相比兩種方式逐片元的方式表現效果更好

效能方面肯定是逐頂點的要好的。

對比如下

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

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

漫反射著色 建立半蘭伯特光照模型

shader halflambert subshader 層次細節 200 lod 200 cg cgprogram 預處理指令 su ce surf 指定此為suface型別的shader,渲染函式為surf halflambert 指定所使用的光照模型為自定義半蘭伯特光照模型 pragma su...

OpenGL 光照模型

材質有三種,也就是對光有三種反射 材質被分為了三個屬性,也分別用三個引數來刻畫 對於乙個頂點,有四個向量來刻畫其光照 計算的時候也分為鏡面 漫和環境三類,之後再疊加起來即得到光照下的顏色 向量nlvr 求解顏色 鏡面反射 is rs max v r a,0 ls 環境反射 ia ra la於是 i ...