末端のクソブログ

末端のクソブログ

クソブログ の 末端 にある クソブログ へ ようこそ

2023.8.27

not 解説記事
久々に日記書きます。ブログ解説以来、恥しか書き連ねてこなかったブログですがしばらくはその日作ったものでも書き連ねます。
前回記事までインターネットの海をクソ記事で汚しまくっていた人間が言っても信ぴょう性は皆無ですが、現在DirectX12のライブラリを作っているのでそれについて適当に。

いままで作ったところ

5月くらいからほんの少しづつ作っているのである程度の機能は作り終わっています。(といってもまだ板ポリゴンを描画する程度のところまでですが)

  • 必要最低限のモジュールのラッパークラス(d3d12device, commandlist, commandallocator, swapchainなどなど)
  • ディスクリプタ―ヒープを自動で割り当ててくれるアロケーター
  • pipelinestateのラッパー
  • 内部でshaderをコンパイルして、shaderreflectionを保持している。
  • pipelinestateのshaderreflectionとrootsignatureの情報からshaderで使うリソース(inputとかtexture,constant,sampler)の自動生成
  • 要するにリソースのバインディングが自動でされるのでunityみたいにSetFloatとかだけで数値を設定できる

ざくっと列挙するとこれくらいだと思います。要するにデータをgpuに送って描画!までは一通りできます。

じゃあ今どこ作ってんの?

gpuにデータ送って描画ができれば全てじゃん。その通り。ただc++のコードで頂点座標をすべて指定して美少女を作るのは無理なので3dモデルのローダーを作っています。具体的にはfbxファイルのローダー。Mayaちゃんだいちゅき(Maya未インストール)
ファイルロード機能と、あと基本的な行列(ビューとかワールドとか)を提供する部分を作ればいったん終わりかなーと思っています。それが終わったらライブラリを拡張して「こんぺーとしぇーだー」や「めっししぇーだー」とかいうのをやっていきます!それぞれの名称は僕のカタストロフ級美的センスによりデフォルメされたものであって、金平糖とメッシの質感を再現するシェーダーを書くわけではありません!

今日やったこと

fbx sdk

fbxとかいうMayaの子分が作ったファイルのフォーマットは謎です。世に出回っているfbxのフォーマット仕様はblender君が勝手に言っているだけです。頑張ればblender様が解き明かしたfbxフォーマットを使って古き良きfreadで読めなくはないですが、fbxの内部構造はmaya内部とどうようにnodeで構成されており、頂点情報をとってくるには、

  • fbxをパースしてノード構造を解き明かす
  • ノードからMeshノードを探す
  • Meshノードが持つ頂点情報をパースする

めんどくさいです。クローバーの葉を分解して分解された切り口からもとのペアの葉をグルーピングしてsizeが4であるのを探すくらいめんどくさいです。そういう時はシロツメクサSDKを使えばよいのです。シロツメクサSDKはありませんがfbx SDKはあります。やったね!

fbx SDKの導入

今日は導入しかしてません。残りの時間はプリパラ見てました。

ダウンロードページから自分のバージョンのsdkを落としてきます。僕はvs2020を使っているので他のバージョンで動くかは知りません。というか別に解説記事でもないのでその旨を書いておきます。GOTO 0

E:\Program Files\Autodesk\FBX\FBX SDK\2020.3.4みたいな雰囲気のパスがあるのでそこのincludeパスとlibパスをvisual studioに設定していきます。いくつか方法はありますが環境変数とか触ったりsdkのパスを動かすのも面倒なのでvsの設定のみ変えます。

  • プロジェクトのプロパティを開く。
  • C/C++>追加のインクルードディレクトリにFBX SDK\2020.3.4\includeを追加
  • リンカー>全般>追加のライブラリディレクトリにFBX SDK\2020.3.4\lib\vs2022\x64\debugを追加。
  • x64,debugの部分は構成の雰囲気で変える
  • リンカー>入力>追加の依存ファイルにlibfbxsdk-md.lib;libxml2-md.lib;zlib-md.libを追加
  • ライブラリディレクトリの中身はこんな感じだと思います。
  • mdのサフィックスはマルチスレッド DLL, mtのサフィックスはマルチスレッドを意味します。これはC/C++>コード生成のランタイムライブラリと一致する必要があります。
  • libfbxsdk.libは動的ライブラリの時に使うらしいです。神サイトに書いてました。
  • libfbxsdkのみならず、libxml2,zlibもリンクする必要があるらしいです。上記のサイトにはないファイルなので放置してましたがリンクしないとxmlどうとかが未解決になっちゃいます。

以上を行うと以下のコードがコンパイルできるかと思います。

#include <fbxsdk.h>
fbxsdk::FbxManager* fbx_Manager = fbxsdk::FbxManager::Create();
fbx_Manager->Destroy();

Createとかで作るのでシングルトンかなと思いましたがInstance関数的なものが見当たらないのでいくつか同時に作れるのでしょう。ロード部分はFbxManagerを使って読んでいくようです。

一瞬freadで実装しかけたのでSDKがあってめでたしです。ただ結局fbxの内部はノード状態。保存できるデータの自由度が高いせいでそういうところに対応しているとそうとう面倒くさそうなのでvertex,normal,uv.index,materialあたりだけ読み込もうかと思います。明日以降。

それはそうと頂点法線って複数持てるんですね(無知)。シェーダーでは基本的に頂点一つにつき法線一つで処理することになると思うので複数個ある頂点法線にたいしては頂点を増やすか、平均をとるしかなさそうです。それぞれハードエッジ、ソフトエッジってことになると思うのですが世の中のレンダリングエンジンはどうしているのでしょうか。個人的にはDCCツール側でハードエッジなら頂点を増やす、ソフトエッジなら頂点法線は一つだけ、という風にデーターを用意してほしいんですけどどうなんですかね。どうなんでしょう。僕はすべてソフトエッジにすることを企んでおります。

最後にfbxのフォーマットを見た所感ですがこれはモデルデータのフォーマットじゃないですね。mayaで編集するために必要なデータがすべて一粒に詰まっているのでグリコも裸足で逃げ出す膨大さです。というかトップノードがシーンである時点でこれってシーンファイルですよね。chat gptにゲームで一番使われているモデルデータのファイル形式を聞いて決めたのですが普通にファイルサイズが無駄にでかそうなので使われていないのでは?という気がしています。