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