UnityShader鏡面反射計算與反射光向量推導

2022-06-02 22:09:11 字數 1319 閱讀 7965

注:本文章主要講解計算方法及推導,原理暫不講解

鏡面反射(specular)又叫高光反射,主要可以來模擬非常光滑的平面受到光線照射所產生的反射效果,使得物體看起來更光滑有光澤。

鏡面反射主要有兩種實現方式:

phong模型:

該模型中關鍵步驟就是計算反射光線。需要提前知道的資訊有:

ks(物體材質的高光反射顏色即材質rgb分量),lightcolor(光的顏色即光的rgb分量),shininess(為反光度係數,越大亮點越小)。

需要計算:r(反射光向量)v(觀察點向量)這兩個為計算重點。

反射光直接使用shader中的reflect函式就可以計算,在這裡我們手動進行推導一下:

在計算之前,我們只知道入射光向量(ao)和法向量(op『),我們需要求的ob。推導如下:

現在我們知道了想要求出ob,還必須要求出來op,但我們現在只知道op』,op怎麼求呢?推導如下:

現在我們求出了ob=ao+2op。op=-(ao·n)n。最後聯立兩式可得:op=ao-(ao·n)*n。這裡的op就是反射光向量r。切記在計算中對法向量單位化是很重要的一步。

計算觀察點向量就簡單多了,只需要知道相機的位置就可以,shader中內建變數_worldspacecamerapos 便捷的提供了相機位置。_worldspacecamerapos-目標點就求出了觀察點向量v。最後所有的值都求了出來,就可以計算了。

blinn-phong模型:

該模型是對phong的改進,為了解決反射光計算的耗時問題。

ks(物體材質的高光反射顏色即材質rgb分量),lightcolor(光的顏色即光的rgb分量),shininess(為反光度係數,越大亮點越小)。

需要計算:h(入射光向量與觀察點向量的中間向量)。計算很簡單:normalize(入射光向量+觀察點向量),入射光向量已知,觀察點向量還和上面的計算方法一樣。

可見blinn-phong模型的計算要簡單快速很多。

858 鏡面反射

題目描述 有乙個特殊的正方形房間,每面牆上都有一面鏡子。除西南角以外,每個角落都放有乙個接受器,編號為 0,1,以及 2。正方形房間的牆壁長度為 p,一束雷射從西南角射出,首先會與東牆相遇,入射點到接收器 0 的距離為 q 返回光線最先遇到的接收器的編號 保證光線最終會遇到乙個接收器 示例 1 p ...

鏡面反射與Phong模型

在許多情形中,與景物的內部距離相比,光源與景物之間的距離大得多,例如太陽光照射乙個城市的情形。在這種情形中,可以假定從光源發出的照明作用在整個景物上是恆定的,可以完全不考慮由於距離所引起的變化。下面再看鏡面反射的情形。鏡面反射是指來自具體光源的光線到達可見表面上的某一點後,主要沿著由入射角等於反射角...

LeetCode 858 鏡面反射

題目 鏡面反射 有乙個特殊的正方形房間,每面牆上都有一面鏡子。除西南角以外,每個角落都放有乙個接受器,編號為 0,1,以及 2。正方形房間的牆壁長度為 p,一束雷射從西南角射出,首先會與東牆相遇,入射點到接收器 0 的距離為 q 返回光線最先遇到的接收器的編號 保證光線最終會遇到乙個接收器 示例 輸...