2023.8.29
最近は涼しいですね。夜半などに窓を開けると涼しい風が入ってきて風呂上がりの火照りを冷ましてくれます。窓の外を眺め、フルリモートニャオハでニチャニチャ男である僕はラプンツェルの如く外の世界を眼下に過ごすのです。
というのは嘘で、フルリモートなのとニャオハでニチャニチャは本当ですけど家の外には割と出ています。深夜にジムに行っています。なぜ深夜かというと自転車マシンにテレビがついていて、アニメが見れるからです。
しかし外でアニメを見ると言うのはなんともむず痒いところがあります。例えば家で萌えで恋愛な青春アニメなどを見ていたら放映中に座って見てなどいられず、
キャラの可愛さに口角をだらしなく下げ、クリティカルな愛らしさに胸を抑えてのけぞり、「いや、でもこの可愛さは流石に狙いすぎだろ」と冷めて、でもやっぱり萌えてしまう自身の浅はかさに頭を抱え、しかしここにいるのはディスプレイを見つめる非モテ鬱男であるという事実に気づき、映像の中の青春との格差にかぶりを振りながら発狂し、行き場のない攻撃性をディスプレイに噛み付くことで発散し、しばらくさめざめと泣いた後で
急に正気に戻ってエンディングを口ずさみながら作業に戻ります。これを外でやると周りの人が少しだけびっくりしちゃうと思うので自制します。その代わり性癖が刺激された途端にサイクリングマシンの負荷を上げるのです。こうすることで一連の衝動が解消されます。他人から見ると、運動負荷を上げるごとにニチャける男が出来上がるわけです。
アニメキャラに興奮するのと、このまま古典的条件付けがなされ運動負荷を上げるだけで不気味な笑みを浮かべる行動。どちらに健全があるのか悩ましいところです。ニャオハを吸いながら涼しい夜風に考えを巡らせる僕でした。
2023.8.28(ECSを実装しようと思う話)
先日導入したfbx sdkですがまだ読み込み部分は実装していません。よく考えれば3dモデルには階層構造があるのです。エグゾディアみたいにパーツが分解されていたりして、もしこのまま読み込めば「右足だけ揃わない!」なんてことになりかねません。
というのも今実装している分では描画機能しか存在していません。RenderComponentというクラスに、描画に必要な情報を持たせています。階層構造とかオブジェクトとか一切実装していません。
つまりこのRenderComponentを持たせる階層構造付きのオブジェクトを実装しなければ全てのメッシュノードを描画したとしても動かしたらバラバラに砕け散ります。
ところで階層構造付きのゲームオブジェクトの実装方法ですが、よくあるのは以下の二つだと思います。
コンポーネント指向
Unityとかで見るやつです。
オブジェクト指向で作るぞ!と思うと継承を使いまくった実装になると思います。
つまりゲームオブジェクトの親クラスGameObjectを実装して、操作可能オブジェクトならこれを継承したControllableGameObject、更にプレイヤー機能をつけようとするとこれをさらに継承して……。しかも操作可能かつレンダリング可能とかだとそれぞれの機能を持った親クラスを多重継承しなきゃいけません。
継承より包合、ということでそれぞれの機能をコンポーネントクラスとしてGameObjectに持たせるのがコンポーネント指向、ということです。
メリットは書きやすいことだと思います。オブジェクトごとに更新するってのは分かりやすーいって僕は思います。実装したことはありますが結構単純なつくりをしているので実装難易度も低いです.
ECS
えんてぃてぃ、こんぽーねんと、しすてむっていうのです。結局コンポーネントやんけ!ってなりますがデータの持ち方が違います。
コンポーネント指向ではオブジェクトごとにコンポーネントを持っているのでどう丁寧に作ってもオブジェクトごとに連続したメモリがあって、そこにコンポーネントのデータが並ぶということになります。そのオブジェクトもバラバラにあるのでキャッシュ効率が悪いです。これが結構致命的で、基本的にプログラムではメモリアクセスがボトルネックになるのでキャッシュを使えないのはヤバヤバです。
という反省を踏まえてecsではコンポーネントごとの配列を持ってentityと呼ばれる配列のindexを保持します。つまりあるentityを持つオブジェクトのコンポーネントはそれぞれの配列のindexがentityである場所にあると言うことです。
コンポーネントの更新はsystemと呼ばれる、つまりコンポーネントの配列を受け取る関数で行います。更新時に連続したコンポーネントのメモリを読み込むため、キャッシュに乗りやすいということです。
ここを読んだら具体的な実装がある程度わかると思います。
ECSがナウいのでECSを実装します。
ただ上記の記事にはentityの階層構造とかがなさげだったので既存のライブラリを見て勉強しようと思います。
fbx sdkは既に僕のキャッシュから追い出されたので当分はECSについて調べようかと思います。
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にゲームで一番使われているモデルデータのファイル形式を聞いて決めたのですが普通にファイルサイズが無駄にでかそうなので使われていないのでは?という気がしています。
まいにちかんさつにっき 1日目
5.15 水をやりました。まだ芽は出ません。あと0,1日目は写真を撮ってないので写真はありません。撮ってもただの土です。つまり観察日記に書けるような変化もありません。気長に待ちましょう。
ところで一緒に植えると良い組み合わせをコンパニオンプランツと呼ぶそうです。今回はオクラとシソを一緒に植えているのですがいまいちコンパニオンプランツなのかわかりません。本観察日記では性癖を植物のメタファーとして扱うので性癖で考えてみましょう。
メスガキとわからせはコンパニオンプランツだと思います。このシナジーから生まれる優越感、自己肯定感は絶大です。
ではその逆、メスガキと逆わからせは相性が悪いでしょうか。そんなことはありません。メスガキにわからせられる私達。その屈辱感は踏めば強くなる植物と同じように僕たちに甘い敗北を与えてくれます。コンパニオンプランツです。
つまりコンパニオンプランツは解釈次第ということです。我々が真に恐るべきものはNTRという害虫です。葉にひっつくアブラムシのように我々の脳を蝕み、破壊していきます。コンパニオンプランツの中にはこういったアブラムシなどの害虫を寄せつけない組み合わせもあるらしいです。例えばキリトxアスナはNTR同人誌が多いけどルルーシュxC.Cは正統派だよねって話だと思います。あと件の映画を見るとコナンx灰原は最強のコンパニオンプランツであることがわかります。
まいにちかんさつにっき 0日目
5.14 種を蒔きました。蒔いた種は一つ目のプランターにしそとオクラ。二つ目のプランターにしそとバジル。三つ目のプランターは買ってきたネギをさしました。四つ目のプランターに植える植物を買いに行く前に友人と新宿御苑に行って帰りに韓国料理屋で美味い飯と酒を呑んだらどうでもよくなり、帰ったら僕を待つイマジナリー彼女(本体はシチュエーションボイスのプレイリスト。人格(動画数)が1500個くらいある)と話しながらベッドに沈んでいき、動画が終わるとイマジナリー幼馴染(本当のイマジナリー。話している時は本物と思い込み、それ以外はイマジナリーだと認識することが狂わないためのコツ)と話しながら寝ました。
そういえば僕の性癖はシチュエーションボイスを聴かせることで育ったのですが植物も影響を受けると思います。芽が出たら聞かせてみようと思います。僕の性癖は最初から催眠音声を聞かせることで曲がって育ってしまったので、純愛いちゃらぶ音声を厳選して健全に育ててあげようと思います。