我将如何计算照明波的法线?
How would I calculate the normals of a wave for lighting?
我正在使用 DirectX11 对平面进行顶点操作,对于我的照明(具有镜面反射的多点光源),我需要重新计算每个顶点的法线。
我的问题本质上是我将使用什么方程来获得此波动方程(在 HLSL 中)的法线 (x & y):
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 坐标时,您将获得法向量。由于我的微积分生锈了,我可能在推导中犯了一些错误。但它应该是这样的。
我正在使用 DirectX11 对平面进行顶点操作,对于我的照明(具有镜面反射的多点光源),我需要重新计算每个顶点的法线。
我的问题本质上是我将使用什么方程来获得此波动方程(在 HLSL 中)的法线 (x & y):
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 坐标时,您将获得法向量。由于我的微积分生锈了,我可能在推导中犯了一些错误。但它应该是这样的。