English | French | Russian | Italian
このトピックのタイトルはこのアプローチはシェーダー/エフェクトに基づいたものだということをほのめかしています。メッシュのジオメトリデータ(i.e. 頂点)を扱ったり、簡単な頂点シェーダーを書いてみましょう。vvvvでエフェクトを書き始めるときはいつもTemplate (EX9.Effect)ノードをから始めるのが良いです。vvvvにクールなモーフィング出来るモデルが含まれている幸運のおかげで、私たちは再び2つの物言わぬシリンダーの間でモーフィングを行います。この様にパッチを準備してください:
もう一度注意しますが、AspectRatio/Cameraのコンビは良いパッチングスタイルというだけでここでは本質的ではありません。このテンプレートエフェクトは本当に基本的で白色のシリンダーが見えるだけに過ぎません。
すべてのコストがかかるマジックはエフェクト内で発生し、このアプローチは他の方法よりはるかにパフォーマンスが優れていることを約束しておきます。それで、私たちは2つ(またはもっと多くの)メッシュをエフェクトに接続するのでしょうか? 実のところそれが全てです。しかし、あなたは1つ以上のメッシュをエフェクトに接続したことはないでしょう。あなたは、両方(全て)のモーフィングターゲットのジオメトリデータが含まれているメッシュを組み立てることでエフェクトを騙さなければなりません。
上のパッチはどのように2つのメッシュの位置と法線成分を1つに詰めるかを示しています。特にVertexBuffer (EX9.Geometry Join)に注目してください。いくつかの追加のピンをアンロックするためにinspektorでそれを選択しなければなりません。いくつかの追加のピンとは、頂点バッファが持つことの出来る1つの"position"という名前の成分と1つの"normal"という名前の成分、それからいくつかの(最大で8つ)の"texture coordinate"とラベルがつけられた成分です。それらは目的に合わせて自由に使うことが出来ます。inspektorを通してVertexBuffer (EX9.Geometry Join)に2つの追加のピンを作成しましょう。2つの"Enable Texture Coordinate .."ピンの値として"3D TexCoords"を選んでください。さて、私たちは頂点バッファに2つ目のモーフィングターゲットの位置と法線を与えることも出来ます。
頂点バッファの成分に位置/法線データを与えることに"3D TexCoords"とラベルがつけられた成分は関係しません。頂点シェーダーを書いた後、頂点バッファからもたらされる正しいデータを読み出し可能にすることを思い出さなければなりません。エフェクトの中で上記で"ラベル"や"名前"と述べられていたものは"セマンティクス"と呼ばれます。さらに詳しくは下記を見てください。
マジックの停止は頂点シェーダーのエフェクト内で発生するでしょう。Template (EX9.Effect)を右クリック開いてパネル内でTFixedFunctionをクリックしてください。私たちのモーフィングエフェクトは変更完了版ではないのでこのtechnique(i.e. technique TFixedFunction...の下の全ての行)を削除して、名前をつけて(e.g. MyFirstMorph.fx)保存(STRG+Shift+S)出来ます。
まず、このエフェクトには"MorphFactor"ピンと2つの色のピンが必要です。次の行を追加してそれらを作成しましょう:
float MorphFactor; float4 Color1: COLOR; float4 Color2: COLOR;
既にある行(エフェクトの上部)の丁度すぐ下に追加します:
//transforms float4x4 tW: WORLD; //the models world matrix float4x4 tV: VIEW; //view matrix as set via Renderer (EX9) float4x4 tP: PROJECTION; float4x4 tWVP: WORLDVIEWPROJECTION; float MorphFactor; float4 Color1: COLOR; float4 Color2: COLOR;
それらの行を追加した後、パッチのエフェクトには3つの新しいピンが付けられることに注目してください。
ではエフェクトの中のこの行
vs2ps VS( float4 PosO : POSITION, float4 TexCd : TEXCOORD0) { ...
これらは実際の頂点シェーダー関数を含んでいます。次の行:
Out.Pos = mul(PosO, tWVP);
これは面白い1行です。入力された1つ目のシリンダーの位置データ(PosO)はworldviewprojection行列(tWVP)によって変換され、エフェクトの結果(Out.Pos)として出力されるという事が書かれています。ここで、入力された1つ目のシリンダーの位置と入力された2つ目のシリンダーの位置を調和をとりつつミックスします。
入力されたPosO変数は1つ目のシリンダーの位置データを意味しているとどうやって知ったのでしょうか? なぜならPOSITIONセマンティクスでマークされているからです。だからもし2つ目のモーフィングターゲットの位置にアクセスしたいならば、それには"TexCoord0"として頂点バッファに与えたので、TEXCOORD0セマンティクスを割り当てた変数を宣言すればアクセスできます。
float4 TexCd : TEXCOORD0;
このサンプルではテクスチャ座標は必要ないならば、単にこの変数を"PosO2"とリネームすることが出来ます。
float4 PosO2: TEXCOORD0;
さて、両方のモーフィングターゲットのアクセスを得てモーフィングを実行することが出来ます。または、ちょっと複雑な(しかし読むことは出来る)この行を:
Out.Pos = mul(PosO, tWVP);
この行で置換します:
Out.Pos = mul(MorphFactor * PosO + (1-MorphFactor) * PosO2, tWVP);
または、HLSLの組み込み関数"lerp"を使って簡単に書けます。これは上の行と全く同じことです:
Out.Pos = mul(lerp(PosO, PosO2, MorphFactor), tWVP);
今、あなたはエラーを注意されたでしょう。少し前に"TexCd"変数を"PosO2"に置換したからです。この行を削除しましょう:
Out.TexCd = mul(TexCd, tTex);
エフェクトはコンパイルされ、あなたがパッチ上の"MorphFactor"ピンの値を変更すれば結果を見ることが出来るでしょう。
まだ色のモーフィングがありません。しかしそれはとても簡単です。テンプレートのピクセルシェーダー関数を:
float4 PS(vs2ps In): COLOR { float4 col = tex2D(Samp, In.TexCd); return col; }
これで置換します:
float4 PS(vs2ps In): COLOR { return lerp(Color1, Color2, MorphFactor); }
これで色のモーフィングが出来ます。
いま、あなたはモーフィングされフラットな影がついたモデルだけを見たいわけではないかもしれません。GouraudDirectional (EX9.Effect)を違う名前で保存し、私たちがTemplate (EX9.Effect)に行ったものと同様の変更を適用します。それには位置データと共に法線のモーフィングもすべきだということに注意してください。
anonymous user login
~3mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~5mth ago