Shader 基礎光照 漫反射光照模型

2021-09-24 14:45:59 字數 1806 閱讀 4244

漫反射(diffuse)

當光線從光源照射到模型表面,該表面回向每個方向散射多少輻射量

漫反射符合蘭伯特定律:反射光線的強度與表面法線與光源方向之間的夾角的余弦值成正比.

漫反射的計算:

diffuse.png

n表面法線和l指向光源的向量的單位向量點乘來表示余弦值,用max防止點乘結果為負數,防止物體被從後面來的光源照亮.

由公式可知,計算漫反射的結果需要四個引數:

1.入射光線顏色和強度

2.材質的漫反射係數

3.表面法線

4.光源方向

在cg中我們使用saturate函式來事先max的操作

逐頂點光照:也被稱為高落德著色,在每個頂點計算光照,在渲染圖元內部進行插值.光照模型**現非線性的計算時,會出現問題.

逐畫素光照:phong著色,在片面之間對頂點法線進行插值.

properties
在properties中宣告乙個color用來得到材質的漫反射材質

subshader
lightmode是一種pass標籤,用來定義該pass在unity流水線中的角色

cgprogram

#pragma vertex vert

#pragma fragment frag

#include "lighting.cginc"

匯入unity的內建檔案lighting.cginc,使用unity內建變數需要

為了在shader中使用properties的屬性,需要定義乙個和該屬性型別相匹配的變數

fixed4 _diffuse;
兩個結構體

struct a2v ;

struct v2f ;

在頂點著色器中計算漫反射部分

v2f vert(a2v v)
1.基本任務將模型頂點從模型空間轉換到裁剪空間.

2.通過unity內建變數獲取環境光部分

3.法線變換,將法線與變換矩陣的逆轉置的矩陣進行矩陣乘法,得到正確的變換後的法線(在世界座標下),這裡法線是乙個三維向量,變換矩陣只需擷取3x3即可

4.直接使用_worldspacelightpos()得到平行光

5.通過上面的公式計算得到diffuse

6.將得到的顏色資訊在frag中進行輸出

對shader進行一些修改來實現逐畫素的漫反射效果,**改變部分

struct v2f ;

v2f vert(a2v v)

fixed4 frag(v2f i) : sv_target

我們將每次的計算放在fragment中進行,得到的結果更加平滑.但是即使我們加入了環境光,仍然無法解決背光面明暗一樣的情況,為了改善這種情況,我們使用下面的光照模型

半蘭伯特模型.png

我們對點乘結果進行α倍數的縮放在加上β的偏移,大多數情況下兩個值為0.5

這樣我們將[-1,1]對映到[0,1],在此模型下背光面也有明暗變化,此模型沒有物理依據,僅作為視覺增強的效果.

背面效果圖:

Note Unity Shader 漫反射光照模型

公式 逐頂點與標準對比 為了使用在properties中的宣告的屬性,需要定義乙個和該屬性型別相匹配的變數!重點是變數!這是個變數!通過這樣的方式,我們就可以得到漫反射公式所需引數之一,材質的漫反射屬性 逐頂點光照會出現一些鋸齒,對於細分模型較低的模型,逐頂點會出現問題 逐畫素光照會在背光區,模型外...

漫反射光照模型

漫反射光照是用於對那些被物體表面隨機散射到各個方向的輻射的進行建模的,在漫反射中,視角的位置i是不重要的,因為反射是完全隨機的,因此可以認為在任何反射方向上的分布都是一樣的。但是入射光線的角度是很重要的。蘭伯特定律 反射光線的強度與表面法線和光源方向之間夾角的余弦值成正比。diffusecol li...

Shader理論《五》漫反射光照模型

漫反射的光照模型計算公式 由上公式可知計算漫反射我們要知道四個引數 入射光線的顏色跟強度c light,材質的漫反射係數m diffuse,表面法線方向l。shader a幻世界 diffusevertex subshader cgprogram pragma vertex vert pragma ...