phong用到的是反射向量,計算反射向量的公式是
r = 2*n(dot(n, l)) - l
這個公式是根據向量的投影公式以及平行四邊形法則推導出來的
詳細步驟請看這篇文章,講的非常好
shader "phong"blinn是乙個人的名字,他叫吉姆·布林,圖形學界的大牛,他發現了使用半形向量代替反射向量的計算方式_specular("specular", range(1, 20)) = 1_speccolor("speccolor", color) = (1,1,1,1)
}subshader
lod 100pass
;sampler2d _maintex;
float4 _maintex_st;
float4 _lightcolor0;
float_specular;
float4 _speccolor;
fixed4 frag (v2f i) : sv_target
endcg}}
}
原理是通過視線向量跟光向量的半形向量代替反射向量
halfvector = normalize( l + v );
在圖形學中,計算光照模型時,經常需要求取反射向量,一般的shader函式庫都提供計算反射向量的方法,下面介紹一下如何手動計算反射向量。
給定入射光線向量i和平面法向量n,求反射向量r,如下圖。為了方便計算,這裡假定i和n都是單位向量(模為1,程式設計時可先將i和n單位化)
設入射光線向量i和反射平面的法向量n之間的夾角為theta。連線i的始端和r的末端,則有
r = 2p - i (1)
現在問題變成了如何求取p,設入射點0到p與n的交點的向量為s,那麼有
p = i + s (2)
現在問題變成了如何求取向量s,向量s即向量-n(注意,這裡是-n,因為s和n的方向相反。)在向量n上的投影,根據向量的投影公式有
因為n是單位向量,簡化一下得到
將s代入公式(2),再將p代入公式(1)得到
將r平移一下,與向量n的延長線相交。
由於入射角和反射角相等,且i和r的長度也相等,所以三角形ion是等腰三角形。故有
on = 2s
所以有r = i + 2s
而s是-i在n上的投影,所以有
由於n是單位向量,簡化一下得到
所以貌似方法二更直觀些。
在圖形學中,計算光照模型時,經常需要求取反射向量,一般的shader函式庫都提供計算反射向量的方法,下面介紹一下如何手動計算反射向量。
給定入射光線向量i和平面法向量n,求反射向量r,如下圖。為了方便計算,這裡假定i和n都是單位向量(模為1,程式設計時可先將i和n單位化)
設入射光線向量i和反射平面的法向量n之間的夾角為theta。連線i的始端和r的末端,則有
r = 2p - i (1)
現在問題變成了如何求取p,設入射點0到p與n的交點的向量為s,那麼有
p = i + s (2)
現在問題變成了如何求取向量s,向量s即向量-n(注意,這裡是-n,因為s和n的方向相反。)在向量n上的投影,根據向量的投影公式有
因為n是單位向量,簡化一下得到
將s代入公式(2),再將p代入公式(1)得到
將r平移一下,與向量n的延長線相交。
由於入射角和反射角相等,且i和r的長度也相等,所以三角形ion是等腰三角形。故有
on = 2s
所以有r = i + 2s
而s是-i在n上的投影,所以有
由於n是單位向量,簡化一下得到
所以貌似方法二更直觀些。
Phong和Blinn Phong光照模型
phong和 blinn phong 是計算鏡面反射光的兩種光照模型,兩者僅僅有很小的不同之處。1.phong模型 phone模型計算中的乙個關鍵步驟就是反射向量r的計算 上圖中的位於表面 下面 的向量 i 是原始 i 向量的拷貝,並且二者是一樣的,現在我們的目標計算出向量 r 根據向量相加原則,向...
高光反射Phong光照模型
高光反射是一種經驗模型,並不完全符合真實世界中的高光反射現象。先根據表面法線 視角方向 光源方向計算出反射方向。通過 phong 模型來計算高光反射的部分。一般都用逐畫素,得到更平滑的高光效果。公式 高光反射光線強度 入射光線顏色 高光反射顏色 max 0,視角方向 反射方向 高光反光度 case ...
新手思路 phong簡單光照模型繪製
第一步 熟悉opengl 程式設計。製作乙個會旋轉的圓錐體,並加入貼圖。第二步 讀取複雜物體表面的頂點資訊。已知複雜物體表面是由乙個個三角麵片構成的三角網格圖形。讀出點 線 面 資訊,然後繪製頂點。第三步 在給定模型的基礎上,在取消光照情況下,首先嘗試自己計算漫反射光照的值。設定光源位置lightp...