Phong光照模型的Shader實現

2022-08-18 07:27:26 字數 2162 閱讀 7853

phong用到的是反射向量,計算反射向量的公式是

r = 2*n(dot(n, l)) - l

這個公式是根據向量的投影公式以及平行四邊形法則推導出來的

詳細步驟請看這篇文章,講的非常好

shader "phong"

_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}}

}

blinn是乙個人的名字,他叫吉姆·布林,圖形學界的大牛,他發現了使用半形向量代替反射向量的計算方式

原理是通過視線向量跟光向量的半形向量代替反射向量

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...