基本光照模型簡單實現

2022-02-08 04:43:38 字數 3316 閱讀 8160

lambert光照模型,根據光照向量與頂點法線的夾角來確定光照強度:

//

upgrade note: replaced 'mul(unity_matrix_mvp,*)' with 'unityobjecttoclippos(*)'

shader

"james/lambert

" }

subshader

cgprogram

#pragma vertex vert

#pragma fragment frag#include

"unitycg.cginc

"fixed4 _lightcolor0;

sampler2d _maintex;

float4 _maintex_st;

struct

v2f ;

float4 frag(v2f i) : color

endcg}}

fallback

"diffuse

"}

phong光照模型,根據光照向量的反射向量與視線的夾角來計算鏡面高光的強度,另外再加上漫射光的成分:

//

upgrade note: replaced 'mul(unity_matrix_mvp,*)' with 'unityobjecttoclippos(*)'

shader

"james/phong

" _gloss(

"gloss

", float) = 1

_shininess(

"shininess

", float) = 10

_speccolor(

"specular color

", color) = (1,1,1,1

) }

subshader

cgprogram

#pragma vertex vert

#pragma fragment frag#include

"unitycg.cginc

"fixed4 _lightcolor0;

sampler2d _maintex;

float4 _maintex_st;

float

_gloss;

float

_shininess;

fixed4 _speccolor;

struct

v2f ;

float4 frag(v2f i) : color

endcg}}

fallback

"diffuse

"}

blinnphong光照模型,根據光照向量和視線的半形向量,與頂點法線的夾角來計算鏡面高光的強度,另外再加上漫射光的成分:

//

upgrade note: replaced 'mul(unity_matrix_mvp,*)' with 'unityobjecttoclippos(*)'

shader

"james/blinnphong

" _gloss(

"gloss

", float) = 5

_shininess(

"shininess

", float) = 10

_speccolor(

"specular color

", color) = (1,1,1,1

) }

subshader

cgprogram

#pragma vertex vert

#pragma fragment frag#include

"unitycg.cginc

"fixed4 _lightcolor0;

sampler2d _maintex;

float4 _maintex_st;

float

_gloss;

float

_shininess;

fixed4 _speccolor;

struct

v2f ;

float4 frag(v2f i) : color

endcg}}

fallback

"diffuse

"}

binnphong比phong少計算一次反射向量,會更簡潔和高效。

帶光源衰減的計算方式:

shader "

james/direct2

" subshader

cgprogram

#pragma multi_compile_fwdbase

#pragma vertex vert

#pragma fragment frag#include

"lighting.cginc

"#include

"autolight.cginc"//

計算陰影所用的巨集包含在autolight.cginc檔案中

fixed4 _color;

fixed4 _specularcolor;

float

_gloss;

struct

a2v ;

struct

v2f

;v2f vert(a2v v)

fixed4 frag(v2f i) :sv_target

endcg

}pass

blend one one

cgprogram

#pragma multi_compile_fwdadd

#pragma vertex vert

#pragma fragment frag#include

"lighting.cginc

"#include

"autolight.cginc

"fixed4 _color;

fixed4 _specularcolor;

float

_gloss;

struct

a2v ;

struct

v2f ;

v2f vert(a2v v)

fixed4 frag(v2f i) :sv_target

endcg}}

fallback

"specular

"}

參考:

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

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

基本光照模型

基本方法是把進入攝像機的光線分成4個部分,每個部分分別有一種分發來計算其貢獻度 自發光 emissive 物體本身產生的光 高光反射 specular 光線從光源照到物體表面反射到眼睛裡的光 漫反射 diffuse 這個部分是光線從光源照到物體表面時,物體向各個方向產生的光。環境光 ambient ...

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

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