Unity Shader學習 簡易PBS實現

2021-09-13 09:31:36 字數 2270 閱讀 7387

簡單根據公式實現了一下基於物理的著色,坑的地方還是有不少,單純的公式搬過來效果會不正確,這裡根據網上資料以及自己調整稍微修改了一下部分計算。高光項: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 允許應用程式指定乙個序列的指令進行...