1.はじめに...ずっと板ポリもあれなので,今回はPMDフォーマットを表示させてみます。モデルデータのプロ生ちゃんはプログラミング生放送様(http://pronama.azurewebsites.net/pronama/download/)よりダウンロードして使用させて頂いております。モデルデータは利用ガイドライン(http://pronama.azurewebsites.net/pronama/guideline/)を読んだうえで,各自でダウンロードしてください。Data(PMD)フォーマットを読み込んでみます。表示だけやりたかったので,後でPBRに移行するというのもあるのでライティングはなしで,テクスチャカラーを表示しているだけの手抜きです。PMDフォーマットですが"通りすがりの記憶"さんのページに詳しいものがまとまっています。ファイルの構成は下記のようになっているようです。・ジョイントリストモデルを表示するだけなら,拡張部分は全くいりませんが後でコリジョンをとりたいなどの場合に剛体リストとジョイントリストを使用することになるので,一応すべて読み込んでおくことにしました。拡張部分というのが必ず存在するのかどうかわからなかったので,一応EOFになっているかどうかをチェックしながら読み取るようにプログラムを組んでみました。そのため最後の方はちょっとコードが汚いです。データ構造は下記のように定義しました。IKボーン番号(影響IKボーン。};非常に読み込みやすいフォーマットになっているので,プログラムの方はファイルを開いてデータ構造通りにfread()していけば簡単に読み込めます。実装は下記のような感じです。}色々なデータで読み込みを試していないので,拡張データのあたりで読み込み失敗とかエラーが発生するかもしれないので,その場合はうまく直してください。一応これでPMDデータ自体は読み込みできるはずです。"初音ミク.pmd"と"プロ生ちゃん.pmd"でしか検証していませんが...。3.描画してみるさて実際に読み込んだデータを表示してみます。プロ生ちゃんのテクスチャデータがすべて*.pngで作られていますが,WICの読み込みを移植していない関係で読み込めません。そこで,今回は*.pngデータをすべて*.ddsに変換して読み込みを行いました。Toolを使って編集を行いました。プログラムの解説に入ります。先ほど実装した読み込みプログラムを使用して,PMDデータの読み込みを行い,テクスチャリストとテクスチャIDリストを構築します。PMDのTextureNameには"test.dds*a.spa"のような感じで,テクスチャファイル名とスフィアファイル名が一緒に入る仕様のようなので,テクスチャファイル名のみを取り出します。これは505行目付近で行っています。ピクセルシェーダでテクスチャマップがあるかどうかを判断すると条件分岐が出てきてしまうため,処理が重くなる可能性があります。そこで,PMDのマテリアルデータにテクスチャがない箇所はダミーのテクスチャを割り当てし,これをピクセルシェーダ内でフェッチするようにします。1.0f)を入れてあります。}続いて,PMDデータから頂点バッファとインデックスバッファ,シェーダに送るための定数バッファなどを構築していきます。}頂点バッファ・インデックスバッファ定数バッファはプログラム的にお決まりパターンになるのでラッパークラスを書きました。頂点バッファの初期化処理は下記のようになります。}インデックスバッファの初期化処理は下記になります。}定数バッファの初期化処理は下記のようになります。}続いて,先ほど構築したテクスチャリストを使ってシェーダに送るためにシェーダリソースビューを作っていきます。}テクスチャの初期化処理やサブリソースの更新もちょっと面倒なので,クラス化してあります。テクスチャの初期化処理は下記のようになります。}サブリソースの更新処理は下記のような感じです。}ちょっとUpload()メソッドの仕様がやっつけ感がありますが,とりあえず今回のサンプルは1回こっきりで使いまわさないことを前提にして作っているので,このままにしておきます。これでようやくコマンドを作成するための下準備が整いました。モデルの描画は結構負荷が高いのでコマンドを全てBundleに積んでしまいます。前回やったBundleがこういうところで威力を発揮します。}ちなみ,ここまでは全て初期化処理です。あとは,フレームを描画する際にBundleを実行してやればよいので,フレーム描画の処理は前回とほとんど変わりません。}初期化処理はかなりごちゃごちゃしますが,フレーム描画処理はスッキリしてよいですね。4.おわりにかなり長くなってしまいましたが,一応モデル表示について説明してみました。頂点データ等を作るのはさほど手間ではないのですが,やっぱりテクスチャデータの取り扱いがDirect3D12は面倒くさすぎて,全くやる気が出ないですね。次回はモーションデータを取り扱おうかなって思っています。Licenseに準じます。10.0.10240.0を用いています。