編集を行った頂点シェーダ部分
以上で頂点シェーダ部分はひとまず完成になります。以下に頂点シェーダ部全文を記載します。
// 頂点シェーダ
VS_OUTPUT Line_VS(float4 Pos : POSITION, float2 Tex : TEXCOORD0)
{
VS_OUTPUT Out = (VS_OUTPUT)0;
//ターゲット用座標
float3 TargetPos = float3(0,0,100);
//出力用座標
float4 LastPos = 1;
//---現在の座標取得---//
//ワールド行列の4行目からワールド座標を取得
float3 ZeroPos = WorldMatrix[3].xyz;
//原点と目標点の間を線形補間で座標を取得
//補間用係数はモデルのZ座標
float3 NowPos = lerp(ZeroPos,TargetPos,Pos.z);
//出力用座標に保存
LastPos.xyz = NowPos;
//---ビルボード計算---//
//現在座標から少しだけ先に進めた座標を取得
float3 NextPos = lerp(ZeroPos,TargetPos,Pos.z+0.01); //変更
//カメラへの視線ベクトルを計算する
float3 EyeVec = normalize(CameraPosition - NowPos); //変更
//現在の座標と先の座標から正面方向のベクトルを得る
float3 FrontVec = normalize(NextPos - NowPos); //変更
//正面ベクトルと視線ベクトルの外積からサイドベクトルを得る
float3 SideVec = normalize(cross(EyeVec,FrontVec));
//現在処理している頂点を左右に割り振る
//すべての頂点のX座標は0.5もしくは-0.5
if(Pos.x > 0)
{
LastPos.xyz += SideVec;
}else{
LastPos.xyz -= SideVec;
}
// カメラ視点ビュー射影変換
Out.Pos = mul( LastPos, ViewProjMatrix );
// テクスチャ座標
Out.Tex = Tex;
return Out;
}
TargetPos変数を書き換えると、0点からその位置に向かってラインが描かれることが確認できます。
(頂点シェーダによって、本来正方形だったものがシェーダで変形し、動作する)
始点、終点を操作してみる
少々横道にそれて、MMD上で始点、終点を操作できるようにしてみましょう。
モデル操作パネル、読込、Modelフォルダ内より、ダミーボーン.pmdを選択、読み込みます。
モデル操作パネルでカメラ・照明・アクセサリを選択、アクセサリ操作パネルからLine.xを選択します。
「地面」と表示されているタブを選択し、先ほど読み込んだ「ダミーボーン」を選び、登録ボタンをクリックします。
再度モデル操作パネルからダミーボーンを選択し、ボーン操作パネルの移動を選択、画面に表示される移動用UIをマウスでドラッグしてみましょう。
ラインの始点が移動し、ビルボードの効果が確認できました。
次に、サンプルファイルのフォルダからtarget.xをMMDに読み込み、再びダミーボーンに関連付けます。
ここでは先ほど操作を行わなかった、ボーン01と表示されているタブからボーン02を選択してください。
ソースコード上部にこのような項目があります。
//ターゲットオブジェクトから座標を取得 float3 TargetPos2 : CONTROLOBJECT < string name = "Target.x"; >;
この、:CONTROLOBJECT~ という部分は、MMEの機能の一つで、こうすることで指定した名称のモデルの座標を取得し、変数に格納することができます(詳細はMME本体同梱の「REFFERENCE.txt」を参照)。
TargetPos2をTargetPosに代入します。
// 頂点シェーダ
VS_OUTPUT Line_VS(float4 Pos : POSITION, float2 Tex : TEXCOORD0)
{
VS_OUTPUT Out = (VS_OUTPUT)0;
//ターゲット用座標
float3 TargetPos = TargetPos2; //修正
これで、ダミーボーンのボーン02(target.xがくっついている)を操作することで赤いターゲットが移動し、その位置が終点となりラインが描画されます。

