勾配の作り方
勾配は接線や法線のどちらか意味している
勾配: gradient, slope
接線: tangent
法線: normal
highitmap上の各ポイントでの接線を求める
左右(dFdx), 上下(dFdy)のピクセル値の色差分を求める。いわゆる偏微分
dFdx, dFdyはfloat, vec2, vec3で動作し、近傍のピクセルの差分を求めてくれる
明示的にtexture samplingする必要はない
normalize(vec2(dFdx(h), dFdy(h))) とすれば、heightmapの上からみた状態での接ベクトルが求められる
normalize(cross(dFdx(world_pos), dFdy(world_pos)))とすれば、任意の形状の法線が得られる
各ポリゴン上の勾配を求める
code:vex
vec3 edge_dir = normalize(neighbor_pos - pos);
接線と法線は直行関係にある
同値と見ても良い
slope = cross(n, up);
n = cross(slope, up);
どれだけ登るのが大変か?というcost計算をしたい場合は、接線や法線の上方向成分を求めると良い
cost = dot(n, up);
cost = dot(tangent, up);