地形の各ポイントの法線を含む地形サーフェスがあります。
地形に適用する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 l = abs(tex2D(HeightSampler, uv + TexelSize * float2(-1, 0)).x);
float bl = abs(tex2D(HeightSampler, uv + TexelSize * float2(-1, 1)).x);
float t = abs(tex2D(HeightSampler, uv + TexelSize * float2( 0, -1)).x);
float b = abs(tex2D(HeightSampler, uv + TexelSize * float2( 0, 1)).x);
float tr = abs(tex2D(HeightSampler, uv + TexelSize * float2( 1, -1)).x);
float r = abs(tex2D(HeightSampler, uv + TexelSize * float2( 1, 0)).x);
float br = abs(tex2D(HeightSampler, uv + TexelSize * float2( 1, 1)).x);
// Compute dx using Sobel filter.
// -1 0 1
// -2 0 2
// -1 0 1
float dX = tr + 2*r + br - tl - 2*l - bl;
// Compute dy using Sobel filter.
// -1 -2 -1
// 0 0 0
// 1 2 1
float dY = bl + 2*b + br - tl - 2*t - tr;
// Compute cross-product and renormalize
float3 N = normalize(float3(-dX, NormalStrength, -dY));
// Map [-1.0 , 1.0] to [0.0 , 1.0];
return float4(N * 0.5f + 0.5f, 1.0f);
}
それでは、どうすれば接線ベクトルと正接ベクトルを取得できますか?
接線ベクトルを見つけるために、法線とZ軸の単位ベクトルの外積をとるだけで十分ですか?(normal.Yは常に正であり、Yは上で、Zは画面を指しています)。
そして、その接線ベクトルを取り、それを法線と交差させて、接線を取得しますか?
次に、法線、接線、バイタンジェントを組み合わせて回転行列を形成し、オレンジ色の法線マップベクトルを回転させますか?
それがうまくいくとしても、これはピクセルシェーダーの多くの計算のようです。これは機能しますか?より効率的な方法はありますか?
編集:
この画像は、私が何をしようとしているのかを理解するのに役立ちます。
通常のマッピングが何か知っているなら、これは簡単だと思います。
さまざまな法線が含まれている法線マップを取得して、サーフェスに適用しようとしています。サーフェスには独自の法線があります。法線マップには、サーフェスよりもはるかに多くの法線が含まれるため、法線が1つしかないサーフェスの単一の部分でいくつかの法線マップの法線がサンプリングされます。