4
シェーダーでベクトルを別のベクトルで回転する
地形の各ポイントの法線を含む地形サーフェスがあります。 地形に適用する2番目の詳細法線マップがあります。 これらの法線は3スペースです。 両方の法線のY値は 常に正です。 両方の法線のX、Z値は、正/負/ゼロにすることができます。 2番目のベクトル(オレンジ)を回転させる1番目の法線ベクトル(青)は、ほぼ水平にすることができます。 計算が簡単/高速になれば、おおよそのソリューションで大丈夫です。 上の画像では、青い表面法線(1番目の法線マップから)、オレンジ色の法線マップ法線(2番目の法線マップから)、および目的の緑の法線が表示されています。 オレンジ色のベクトルの回転量は、青の法線ベクトルがXZ平面(DirectX座標系のようにYが上にある)と形成する角度とほぼ(または可能であれば正確に)等しくなければなりません。 次に、2番目のシナリオを示します。 上の画像では、青い表面法線がほぼ水平なので、2番目の法線マップがほぼ垂直な表面に適用されているため、オレンジ色の法線マップベクトルはさらに回転しています。 ローテーションはHLSLシェーダーで実装されています。 2番目の青い法線の方向に基づいて1番目のオレンジの法線を回転させる方法を教えてください。 編集:たぶん私は正接だけでなく正接と正接が必要ですか? これが私が正常になる方法です: float4 ComputeNormals(VS_OUTPUT input) : COLOR { float2 uv = input.TexCoord; // top left, left, bottom left, top, bottom, top right, right, bottom right float tl = abs(tex2D(HeightSampler, uv + TexelSize * float2(-1, -1)).x); float …