unity3D Shader《三》漫反射

2021-06-29 10:42:04 字數 1749 閱讀 8772

一、漫反射的說明

對於粗糙物體表面的某一點,其亮度應該和入射光線與該點的垂直程度有關,也就是入射光線與此點的夾角相關。如果我們用l表示單位長度的入射光線,用c表示到達此點的光線強度和顏色,用n表示此點的髮線,那麼物體表面此點的亮度lum就可以用下面的公式來表示:

lum = c * max(0,cos)

表示的是方向向量l和n之間的夾角,其cos就是這兩個方向的點乘積,在unity通過cg的標準函式庫dot(l,n)來完成。這個值對於背向光線的點來說為負,其實就是對其照明為0,因此使用標準函式庫中的max(0,value)來對結果進行一些控制。計算到此為此我們叫按照這種方式對物體進行照明計算的模型叫做lambert。

對應的**段為#pragma su***ce surf lambert。

(注意,這個lambert可以命名為其他的名字,相應的寫光照模型函式時,其命名也要改變比如unity內建三個lighting model函式,

如果用#pragma su***ce surf lambert命名光照模型函式的話

這三個的函式名為

half4 lightinglambert(su***ceoutput s, half3 lightdir, half atten){} 

這個函式被用於forward rendering(

正向渲染

),但是不需要考慮view direction(觀察角度)時。

如果用#pragma su***ce surf basicdiffuse命名,則後面書寫這些函式時,就如下面所示

half4 lighting

basicdiffuse

half4 lighting

basicdiffuse

_prepass

) 二、具體漫反射**

shader "custom/mylighttest" 

subshader

lod 200

cgprogram

#pragma su***ce surf basicdiffuse

//對上面一行的解釋

//su***ce - 宣告的是乙個表面著色器

//surf - 著色器**的方法的名字

//lambert - 使用的光照模型。

//規則#pragma su***ce su***cefunction lightmodel [optionalparams]

//su***ce - 宣告的是乙個表面著色器

//su***cefunction - 著色器**的方法的名字

//lightmodel - 使用的光照模型。

//#pragma su***ce surf basicdiffuse 自定義了光照模型為basicdiffuse,

//下面的函式為實現這個自定義的光照模型,函式命名規則為lightin加上自定義的自定義的光照模型名稱

inline float4 lightingbasicdiffuse (su***ceoutput s,fixed3 lightdir,fixed atten)

sampler2d _maintex;

float4 _emissivecolor;

float4 _ambientcolor;

float _change;

struct input ;

void surf (input in, inout su***ceoutput o)

endcg

} fallback "diffuse"

}

Unity3d Shader 運動模糊

攝影常用的一招就是延時攝影,以使運動的物體產生運動模糊。攝影技巧為 1,三角架固定相機 2,調長 時間 3,物件有運動物體和靜止物體參照 用了延時攝影,會產生藝術感,見下圖 2015年1月 拍攝於上海陸家嘴 遊戲方面可喜的是unity3d也可以實現類似效果,先看效果圖 第一張為無運動模糊 第二張為有...

Unity3D Shader 入門學習

unity3d 的所有渲染工作離不開著色器.shader 著色器其實是一小段程式,它負責將輸入的mesh網格.以指定的方式和輸入的貼圖或者顏色等組合作用.然後輸出.繪圖單元可以依據這個輸出來將影象繪製到螢幕上 輸入的貼圖或顏色等,加上對應的shader,以及對shader的特定引數設定,將這些內容 ...

unity3d shader之浮雕效果

浮雕就是對影象上的乙個畫素和它右下的那個畫素的色差的一種處理 非常容易,只需要乙個簡單的演算法 用fragment shader來實現 我們只看實現部分就好 在frag函式中 mc00mc tex2d maintex,i.uv maintex rgb 獲取當前點的顏色 mc11 tex2d main...