2015-12-10 67 views
0

我正在做一個DirectX11平面的頂點操作和我的照明(具有鏡面反射的多點光源)我需要重新計算每個頂點的法線。如何計算照明波的法線?

我的問題基本上是,我會用做獲取法線這波方程(X & Y)(在HLSL)什麼公式:

input.position.y = height * sin(input.position.x + time) * sin(input.position.y + time); 
+0

表面上的一個點的法線是一個矢量,該矢量指向該表面並垂直於該點處的表面。 看起來您正在數學計算表面點位置,因此您可以依靠表面法線的數學定義來計算表面法線的相似公式。您不會顯示整個位置的公式,所以我們只能猜測公式應該用於*您的*表面。 – legalize

+0

嘗試搜索有限差異。也許使用computeshader是處理這個問題的最佳方法。 – kaiser

回答

1

你需要計算切線沿兩個表面x軸和y軸。您可以在頂點着色器中的每個頂點執行此操作。頂點的法線是該頂點切線向量的叉積。

爲了得到切線,你需要計算你的方程的導數。您的方程的形式是:

f(x,y) = a*sin(b*x+t)*sin(c*y+t) 

a是波,bc是波長或期間和t的振幅(或高度)是波的相位。這樣的功能的偏導數爲:

df/dx = a*b*cos(b*x+t)*sin(c*y+t) // tangent equation along x-axis 
df/dy = a*c*sin(b*x+t)*cos(c*y+t) // tangent equation along y-axis 

在你的情況a=heightb=c=1。在切向量是:

tx = [x, y, df/dx] // tangent vector along x-axis at point (x,y) 
ty = [x, y, df/dy] // tangent vector along y-axis at point (x,y) 

最後,計算出正常的你把切向量的叉積:

n = cross(tx,ty) 

注意的積物的順序。如果您切換訂單,則結果將爲-n。評估叉積,我們得到:

n = [y*((df/dy)-(df/dx)), x*((df/dx)-(df/dy)), 0] 

在上述載體代df/dxdf/dy

k = (a*c*sin(b*x+t)*cos(c*y+t) - a*b*cos(b*x+t)*sin(c*y+t)) 
n = [y*k, x*(-k), 0] 

因此,對於您的公式得到:

k = height*(sin(x+t)*cos(y+t) - cos(x+t)*sin(y+t)) 
n = [y*k, -x*k, 0] 

在每個頂點,當你放入x和y座標,你會得到法向量。因爲我的微積分是生鏽的,所以我可能在我的推導中犯了一些錯誤。但它應該是沿着這些線的東西。