はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX12 PMDファイルの表示に成功した話 ~犯人は変換行列~

あいさつ

どうも、はかせです。

今日はついにPMDファイルの描画に(一部)成功したので
その話です。

進捗

細かい話を始める前にまずは本日の成果です。
f:id:hakase0274:20191013173503p:plain

ミクさんの形だけですが描画することに成功しました!

ここまで来るの本当に長かった・・・!

やったこと

成果報告が終わったところで細かい話に移ります。

とはいっても今回できたことは
・PMDファイルを読み込む
・頂点バッファーとインデックスバッファーを作成
・素直に描画し白のテクスチャをあてがう

この三つだけです。

PMDファイル読み込みは以前上げたPMDファイル読み込みでほぼ出来てました。
hakase0274.hatenablog.com

頂点バッファーとインデックスバッファーは
過去に作ったものやネット上のものを切り貼りして作りました。

白テクスチャは適当にペイントで作ったものをWIC使って読み込みました。
DirectX12でWICを使うやり方はこちらをどうぞ
hakase0274.hatenablog.com

描画は単純にDrawIndexedInstance()を呼び出しただけです。

なぜ今までできていなかったのか

まぁやったこと含めネット上でググれば割と出てきます。
じゃなんで今の今まで画面にミクさんが出てこなかったのか。

実は今までも描画そのものはできてたっぽいです。

ただ描画するさいに使っていた変換行列にミスがあったため
スクリーン画面上に描画されていなかったです。

何言ってるか文字だとわかりづらいと思うので画面を用意しました。
f:id:hakase0274:20191013180042p:plain
(unityちゃん=今回表示したモデルと認識してください)

モデルは出てるもののカメラの描画範囲内にいないので
実際画面には出てこないってわけですね。

さてどういう問題が起こってたかの話が終わったところで
次はなんでこんなことになっていたのかって話に移ります。

これはタイトルにも書いてますが、
変換行列にミスがありました。

変換行列ってのは
World、View、Projectionの三つの行列の掛け算で求まる行列のことです。
(極めてざっくり言うと)

私は今までこの行列をCPU側で計算し、
計算結果をシェーダーに流していました。

ただ今回いつもとやり方を変えようと
この変換行列の計算をシェーダー側
つまりGPUに任せました。

さてここまでは異常がなさそうですよね。
(もしかしたらもうすでに察してる人いるかもですね)


そう問題はないんです。
ちゃんとやっていれば。

変に引っ張ってもくどいだけなんで結論から言うと
変換行列として計算済みの行列を
同じく変換行列を計算するシェーダーの渡していた
んです。

要は実際行われていた計算はこうです。
World * View * Projection * View * Projection

ViewとProjectionの行列が2回掛けられていますね・・・orz

この計算が余計で行列の値がおかしいことになり、
画面外に描画されてしまっていたというのが
ここ数日の問題の原因でした。

あとがき

今回はPMDファイルの形の描画ができた話でした。

最初にガンガン移植したときにこの変換行列の計算クラスも
移植していたので変な二重計算が走っていたというオチでした。

いやぁ~
切り貼りコピペプログラミングの弊害ですね。

一回ちゃんとどこでも動くような汎用ライブラリ的なものに
機能をまとめておいた方がいいかもですね。

そしてそのライブラリに合わせてプログラムを組む的な
そんな脳死プログラミングを私はしたい。
(DTLとかいい例かもしれない)

それでは今回はこの辺でノシ