最近GDC Vaultで見た動画まとめ
2017年に販売されたFPSゲーム、「Destiny」の多彩多様のグラフィック表現を描画するために独自のシェーダー言語「TFX」の仕組みとその周りのツール操作、最適化などのあらすじを発表したもの。 未だ技術の知識が足りない関係で個人としては30分周りから理解しづらくなってるが理解しきれると独自のグラフィックパイプラインを取り組むときにはすごく参考になりそうです。
頂点シェーダーでテクスチャーを活用して、ベーキングされたアニメーションなどを効果的に動かせるために取り組んだものについて説明をする動画。すこしでもグラフィックスでの知識があれば十分理解できるし、そして自然に「おおっ。。。」となると思います。 4Kのテクスチャーに450個のボーンを入れて30回ずつアニメーションを描画させてもなんと21分くらいのアニメーションができるそうです。 この動画で一番面白かったものは頂点アニメーションの各頂点の情報じゃなくて、ボーンへの情報を入れて動かせるアイデアがあったということですね。
2017年に販売されたオープンワールドRPGゲーム、「Horizon Zero Dawn」を開発しながら、既存のDecimaエンジンに追加的に実装した各種のツールなどをどうやって実装してゲームの開発に適用したのかを公演。これも個人としては30分あたりから急に難しくなって、Broadcaster?Observer?パターンみたいなゲームオブジェクトの変更によるツールとのやりとりからは理解しにくかったです。 でもツール実装に関心があったらぜひ見てほしい動画。僕もツール・グラフィックス目指してますので見ました。
C++の類似デストラクタ(Pseudo-Destructor)のメモ
Pseudo Destructorとは
Pseudo Destructorは、単語通りに「類似」のデストラクタです。
テンプレートプログラミングなどをして、型引数 T
がデストラクタを持っているかないかにかかわらず挙動を同じにさせる時に良く使われるらしいです。
クラスではないタイプを使用しても、SFINAEまたはあらゆる方法として検査する必要なく同じコードを書くことが出来ます。
typedef int I; int main() { I x = 10; x.I::~I(); x = 20; }
しかしClassではないタイプに対する類似デストラクタは、デストラクタを呼んでもそのタイプの変数の値は変わりません。なぜなら類似デストラクタは呼び出されても何もしないからです。
この類似デストラクタは、Scalarタイプ(Classではないタイプ)のポインターを持つ変数の->
オペレーターとしても呼び出せるそうです。
一体どこに使えるかちょっと迷いますけど、TMPをずっとやってたら使う時が来ると思います。
参照
プロジェクトをVS2019に移しました。
本日Visual Studio 2019が出たので、早速VS2017から作業環境を変えました。
性能的にはVS2017からもメモリ占有率か使用容量が1/4までに減ったそうですので期待をもって移してみましたが、そんなに減ることじゃなかったです。多分Reshaper C++のせいでメモリの使用量が変わってないんだと思いますけど。
ですけどUIとしてはちょっと清潔になったような気もしますし、これをきっかけとしてDyの作業をまた続けたいと思います。
How is Vulkan defferent from previous graphics APIs?のメモ
- OpenGLのような昔のグラフィックスAPIは現在のGPUのデザインとは結構違う時期に設計されたものである。
- 現代のGPUは無数なコアがあって、それを並列的に処理させてレンダリングなどに必要となる演算量をカバーすることになっている。
- しかし、OpenGLはそれをまともに支援してないため性能が落ちる恐れがある。
- OpenGLは全域的な状態マシンがあって、それをいちいち管理しなければならない。手続き的なモデルを持つ。
- 現代のゲームはオブジェクト志向的になっていて、OpenGLのような「Implicit」なAPIをただ適用するのは無茶
- Vulkanなどの最近この4年間ででたAPIは全てを明示的にしていて、現代のGPUのモデルの理念と一緒にしている。
- Vulkan 1.0はOpenGL ES 3.1が支援できるハードウェアなら支援する。
再度報告。DyのSDFフォントジェネレーターに機能を追加しました。
- 「About」窓を作りました。後のFixedバージョンではAbout窓に使ったライブラリの名前、そして製作者のブログの遷移先を実装します。
- フォントのSDFマップの生成手順のロジックを変えました。以前までは
std::async
とstd::future
を使用しましたが、あまりにも見づらく、効率が上がってないでしたので単純にstd::thread
を使って並列に生成することにしました。 - UTF-8形式の
txt
またはcsv
ファイルを読み込み、そのファイルにある全ての文字に対するマップを自動的に生成するようにしました。重複な文字は省略されます。 - 2つ目のフォントファイルを読み込んで、もし1つ目のフォントから該当する文字がなかった場合に次として文字のマップを変わりに生成してくれるようにしました。
- マップを生成する時に、タイトルバーで進行状況を知らせるようにしました。
Fixedバージョンが出来たら下に補足します。