簡單根據公式實現了一下基於物理的著色,坑的地方還是有不少,單純的公式搬過來效果會不正確,這裡根據網上資料以及自己調整稍微修改了一下部分計算。高光項:cook-torrance,漫反射項:disney
左邊為實現的效果,右邊為unity2017自帶standard
shader部分:
shader "unlit/brdf2"
_roughness
("roughness"
,range
(0.0
,1.0))
=0.5
_f0(
"f0"
,range
(0.0
,10.0))
=0.5
} subshader
lod100 pass ;
struct v2f
;sampler2d _maintex;
float4 _maintex_st;
float _f0;
float _roughness;
//brdf光照模型cook-torrance
//specular(v,l)=f(h,l)*(g(v,l,h)*d(h))/(4*(ndotv)*(ndotl))
//f:菲涅爾因子,反射光線的強度和顏色與入射角度之間的關係函式。
//d:微平面分布函式,返回某一給定方向微平面比例。
//g:幾何遮罩,微平面的自遮蔽情況。
//v:視角方向
//l:光源方向
//h:中間向量=(v+l)/2
//n:法線向量
//f項:schlick公式
//f(v,h)=f0+(1-f0)*pow((1-(vdoth)),5)
//f0表示光線方向和法線方向一致時的折射率,你可以直接把它當做乙個菲涅爾的調節值。
float
fresnelschlick
(float f0,float3 lightdir,float3 halfdir)
//d項:ggx分布函式
//d(h)=a*a/(pi*pow((pow(ndoth,2)*(a*a-1)+1),2))
//a為粗糙度=roughness*roughness
float
distributionggx
(float roughness,float3 normaldir,float3 halfdir)
//g項:smith-schlick方程
//k=pow((roughness+1),2)*0.125
//g1(v)=ndotv/(ndotv*(1-k)+k)
//g(l,v,n)=g1(l)*g1(v)
float
geometrysmithschlick
(float roughness,float3 lightdir,float3 viewdir,float3 normaldir)
//specular(v,l)=f(h,l)*(g(v,l,h)*d(h))/(pi*(ndotv)*(ndotl))
float3 cooktorrancespecular
(float f0,
float roughness, float3 viewdir, float3 lightdir, float3 halfdir, float3 normaldir)
//disney diffuse
//fdiffuse=(basecolor/pi)*(1+(fd90-1)*pow((1-ndotl),5))(1+(fd90-1)*pow((1-ndotv),5))
//fd90=0.5+2*roughness*pow((hdotl),2)
中,實際使用的公式,最終並沒有除以π
float
disneydiffuse
(float roughness,float3 halfdir,float3 lightdir,float3 normaldir,float3 viewdir)
float4 frag (v2f i)
: sv_target
endcg}}}
unity shader 學習筆記
upgrade note replaced world2object with unity worldtoobject upgrade note replaced mul unity matrix mvp,with unityobjecttoclippos shader unity shader b...
unity shader學習總結一
學習unity shader有兩個月了,最近的兩個月總是有一些工程專案,占用我大量的學習時間,因此總是停停學學。今天虛擬校園工程開好完成了,就有時間吧自己學到的shader,總結一下。這是兩個 jianbian紋理 實現的效果如下 如下 shader custom katongmylihmodel ...
Unity Shader學習1 簡述
一 什麼是shader shader,就是著色器,是一種執行在 gpu 上的程式。gpu programmable graphics processing unit,即可程式設計圖形處理單元,也稱為可程式設計圖形硬體。至於 gpu 上的程式設計,實質上就是 gpu 允許應用程式指定乙個序列的指令進行...