0
我正在做一個DirectX11平面的頂點操作和我的照明(具有鏡面反射的多點光源)我需要重新計算每個頂點的法線。如何計算照明波的法線?
我的問題基本上是,我會用做獲取法線這波方程(X & Y)(在HLSL)什麼公式:
input.position.y = height * sin(input.position.x + time) * sin(input.position.y + time);
我正在做一個DirectX11平面的頂點操作和我的照明(具有鏡面反射的多點光源)我需要重新計算每個頂點的法線。如何計算照明波的法線?
我的問題基本上是,我會用做獲取法線這波方程(X & Y)(在HLSL)什麼公式:
input.position.y = height * sin(input.position.x + time) * sin(input.position.y + time);
你需要計算切線沿兩個表面x軸和y軸。您可以在頂點着色器中的每個頂點執行此操作。頂點的法線是該頂點切線向量的叉積。
爲了得到切線,你需要計算你的方程的導數。您的方程的形式是:
f(x,y) = a*sin(b*x+t)*sin(c*y+t)
凡a
是波,b
和c
是波長或期間和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=height
,b=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/dx
和df/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座標,你會得到法向量。因爲我的微積分是生鏽的,所以我可能在我的推導中犯了一些錯誤。但它應該是沿着這些線的東西。
表面上的一個點的法線是一個矢量,該矢量指向該表面並垂直於該點處的表面。 看起來您正在數學計算表面點位置,因此您可以依靠表面法線的數學定義來計算表面法線的相似公式。您不會顯示整個位置的公式,所以我們只能猜測公式應該用於*您的*表面。 – legalize
嘗試搜索有限差異。也許使用computeshader是處理這個問題的最佳方法。 – kaiser