Opengl中reflect反射演算法

2021-10-07 17:29:07 字數 646 閱讀 6856

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