在opengl或者其他的遊戲引擎shader(比如unity3d中),都有乙個方法叫做reflect用來計算光的反射向量,他的引數就是入射光向量和畫素法線向量。reflect(r,n)。那麼他的內部原理到底是什麼呢?
我們先來看下下面這個:
如圖所示,l就是入射向量,n就是法線,r就是反射向量,r是r平移到l的箭頭上和n構成了乙個三角形(向量沒有位置,只有方向,所以可以隨便平移),l是l平移到r的箭頭上和n構成了乙個三角形,於是這就構成了乙個菱形。
我們根據三角公式:a = |l| cosθ
如果l是單位向量,則a = cosθ
那麼菱形的垂直中線長度 t = 2·cosθ
然後我們乘以n的單位向量,把t從標量變成向量
t = 2·cosθ·n
根據向量的特性,r = 2·cosθ·n - l
因為n和l都是單位向量,我們根據向量點積運算:
l·n = |l||n|cosθ
因為單位向量的長度為1,於是整個方程又可以簡化為
l·n = cosθ
於是 r = 2·dot(l,n)·n - l
以上便是reflect的運算公式
OPENGL簡介 反走樣
由於計算機以離散點生成圖形,生成圖形必然與真實景物存在差距,這種差距表現為 直線或光滑曲面的鋸齒 花紋失去原有色彩形狀 細小物體在畫面的消失等。統統叫做走樣 aliasing 反走樣可以減少這種情況。粗略設想一下,就是把原來邊界的地方鋸齒部分用低飽和度的點補上,這樣既不影響整體輪廓,又獲得較好的平滑...
OpenGL反走樣 待續
同時我們也注意到,我們所主要引用的參考文獻easy wireframe display with barycentric coordinates中提到了利用opengl內建函式fwidth實現反走樣的方法 在後面的工作中,找到了另外幾種實現反走樣的方法,蒐集對比一下,詳見該篇文章 drawing a...
Go中反射(reflect)的應用
package main import fmt reflect type monster struct 顯示s的值 func s monster print 返回兩個數的和 func s monster getsum n1,n2 int int 設定s結構體的在 func s monster set...