はかせのラボ

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

DirectX12 MMD表示の初歩を刻む ~ファイル読み込みの話~

あいさつ

どうも、はかせです。
あらかた自分が使う機能の移植(ほぼ新規開発)が終わりましたので
今回からまたDirectX12の勉強を開始していきます。

そんなわけで今回からMMDの描画の勉強を始めます。
第一回の今回はMMDもといPMDファイルの話です。

PMDファイル

DirectX12には11以前にあったような
気の利いたバイナリデータ読み込みの機能は存在しません。
全てプログラマーが自前実装する必要があります
(一応WICとかあるけど結局めんどくさいのは変わらない)

なのでPMDファイルの中身がどのようになっているか
知る必要があります。

PMDファイルの構成はこうなっているようです。

PMD ファイル
 ・ヘッダ
 ・頂点リスト
 ・面リスト
 ・材質リスト
 ・ボーンリスト
 ・IKリスト
 ・表情リスト
 ・表情枠用表示リスト
 ・ボーン枠用枠名リスト
 ・ボーン枠用表示リスト
 --- 拡張部分 ---
 ・ヘッダ(英語)
 ・ボーンリスト(英語)
 ・表情リスト(英語)
 ・ボーン枠用枠名リスト(英語)
 ・トゥーンテクスチャリスト
 ・剛体リスト
 ・ジョイントリスト
引用:☆PROJECT ASURA☆ [Direct3D 12] 『モデル表示(1)』

多いといえば多いですが、
拡張部分は無視しても構わないとのことなので
今回私は無視していきます。

実際に読み込む

さてデータ構造がわかったので読み込んでいきましょう。
とはいっても参考元のコピって少し自分の環境で使えるよう
手直ししただけなのでここで改めてコードは出しません。
(長いから)


なのでここでは読み込みに使った_wfopen_sとfreadについて
少し語っていきます。

基本的にファイルの読み込みの流れとしては
・fopen_sもしくは_wfopen_s使ってファイルを開ける
・freadを使って読み込む

この二つです。

この流れはPMDファイルに限らず
割となんのファイルでも使えます。
(パーサは自前でゴリる必要ありますが・・・)

_wfopen_sは指定したファイルを開けて
そのファイルへのポインターを入手します。
ファイルを開けるものなので
開き方も指定できます。
(読み/書き)
docs.microsoft.com


freadはファイルを読み込むものです。
読み方はかなり原始的でバイトレベルでの話になります。
そのためデータを受け取るバッファーを正確に用意してあげれば
どんなファイルのデータであっても読み込むことが可能です。

バイトレベルのデータが直接バッファーに入ってくるので
プログラマー側でめんどうなキャスト処理を入れる必要もありません。
(つまりボクシングなんかも起こりえない)
やはりバイトレベルでのプログラミングこそ最強。
www9.plala.or.jp

あとがき

今回はPMDファイルの話と
それに伴い使ったファイル読み込みの話でした。
(ぶっちゃけこっちがメインまである)

データを読み込むだけならこの記事で紹介した方法で
ほぼすべてのデータをゴリることができます。
(データ型調べたり必要なバッファー作ったりはまた別のお話)

さて次回以降は読み込んだデータの表示を
やっていきたいわけですが、
やっぱDirectX12むずいですね。

11までは雰囲気プログラミングでどうにか物が出ましたが、
12では全然出てきません。

色々知識が乏しすぎるせいで
なんでできないの?とか
逆になんでこのコードは実行できてるの?とか
そもそもこのコードは何やってるの?とか
Microsoftのサンプルや数多くある先駆者のサンプルを見ても
はてなマークが大量生産されていますw
(知識も足りなければ知能指数も足りない)

今までみたいにネット上の知識を
虫食いでやってくんじゃなくて
本買って体系的な知識をしっかりつけたほうがいいんですかね。

DirectX12の勉強をするにあたって
おすすめの本とかサイトとかあれば
是非教えてください。

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