2016-10-18 3 views
0

最近、自分のシェイダーのどこかにコードスニペットがほとんど見られませんでした。ベクトルで構成される回転行列を正規化する必要がありますか?

次のようにコード(本当にシェーダ言語が何であるかは重要ではありません。)

float2 mv = tex2Dlod(_CameraMotionVectorsTexture, uv).rg * _Amplitude; 

// Make a rotation matrix based on the motion vector. 
float2x2 rot = float2x2(mv.y, mv.x, -mv.x, mv.y); 

// Rotate and scale the body of the arrow. 
float2 pos = mul(rot, v.vertex.zy) * _Scale.xy; 

// Normalized variant of the motion vector and the rotation matrix. 
float2 mv_n = normalize(mv); 
float2x2 rot_n = float2x2(mv_n.y, mv_n.x, -mv_n.x, mv_n.y); 

// Rotate and scale the head of the arrow. 
float2 head = float2(v.vertex.x, -abs(v.vertex.x)) * 0.3; 
head *= saturate(color.a); 
pos += mul(rot_n, head) * _Scale.xy; 

あなたの男が見るように、その腐敗行列は正常化していない動きベクトルで作られました。 rot_nと呼ばれる第2の回転行列の2軸ベクトルは、回転行列を作成する前に動きベクトルで正規化された正規化されたものになります。なぜ私は回転行列を作る前に、コードの作成者が動きベクトルを全面的に正規化できないのでしょうか?

誰かが私が質問を取り除くのを助けることができました、私は本当にそれを感謝します。先進的にありがとう!

+1

'rot'は純回転行列ではありません。それはスケーリングを含むことができる。これはおそらく矢の長さに基づいてスケールされるべきではないが、矢印の範囲を説明するために行われる。しかし、入力を知らなくても話すことは不可能です。 –

+0

@Nico Schertler。こんにちは、あなたは正しいです、それが存在すれば、スケール線形変換を取り消してください – haoc

答えて

0

がスケールに含まれる可能性があります。スケールを元に戻すだけです。

関連する問題