recent works

最近作ったもの紹介。全て Unity から使う前提で作ってはいますが、BatchRenderer 以外は Unity 依存度は低く、一応他のプログラムから使うこともできるはずです。また、全て MIT ライセンスか CC BY ライセンスなので、ソースレベルで切り貼りして使うのも問題ないようになっています。

PatchLibrary

https://github.com/i-saint/PatchLibrary
実行中のプログラムにロードされている dll を強引に更新するツールです。プラグイン開発などの際、VisualStudio ビルド後イベントでこれを呼び、実行中のホストプログラムを再起動することなく更新する、というような使い方を想定しています。
以前作った DynamicPatcher の簡易版的なもので、dllexport されている関数のテーブルを書き換えて新しい dll の関数にリダイレクトさせることで更新を実現しています。このため、dll で作成したコンテキストを保持しているような場合に途中でこれで更新すると死ぬなどの問題がありますが、その点を理解して使えばそれなりに有用です。以降のツール群はこれ使いながら開発しています。

FrameCapturer

https://github.com/unity3d-jp/FrameCapturer
https://raw.githubusercontent.com/unity3d-jp/FrameCapturer/master/Screenshots/gif_capturer.gif

ゲーム画面をキャプチャして gif アニメや exr などに出力する代物です。後述の TweetMedia を同梱しており、画面のキャプチャから Twitter への投稿までを全てゲーム内からできるようになっています。
開発ブランチでは mp4 キャプチャも実装中で、まだ若干動作が怪しいものの、キャプチャから Twitter への投稿まで機能するようになっています。(Twitter は web からは動画は投稿できないものの、API レベルでは mp4 を受け付けるようになっています) こちらも近い先ちゃんと公開する予定です。

TweetMedia

https://github.com/unity3d-jp/TweetMedia
前述の通り、Twitter にメッセージと画像/mp4 動画を投稿できるようにする代物です。
既にいい実装があればそれを使いたかったんですが、画像/動画まで対応したのは見つけられなかったので仕方なく自作しました。(と言っても大部分は twitcurl を流用していますが)


BatchRenderer

https://github.com/i-saint/BatchRenderer
https://raw.githubusercontent.com/i-saint/BatchRenderer/master/Screenshots/procedural_gbuffer.gif
こちらは単なる機能追加ですが。Unity 5.1 で CommandBuffer.DrawProcedural() が加わり、やっと Unity の描画パイプラインからインスタンシング描画をできるようになりました。これを使って DrawProcedural() で G-Buffer を生成する機能を追加した、というものです。
本物のインスタンシング描画なので当然ながら何十万インスタンスであろうと 1 drawcall で描けはするのですが、残念ながら速度面では擬似インスタンシングとあまり変わらないようです。DrawProcedural() はその不思議な仕様上、頂点データへのアクセスに間接参照が必要になるため、理想的なケースに比べると一歩パフォーマンスが落ちる感触です。それでも実用に足る速さは出てるとは思うんですが、surface shader が使えなくなるデメリットを覆せるほどのメリットが擬似インスタンシングに対してあるかと問われると、現状返答に詰まる感じです…。
スクリーンショットは SD Unity ちゃんを 2000 体 (約 16,000,000 triangles) 出してみたもので、このくらいがうちの GeForce GTX 970 で 60 FPS 出せるギリギリのラインになっています。

AlembicImporter

https://github.com/unity3d-jp/AlembicImporter
https://raw.githubusercontent.com/unity3d-jp/AlembicImporter/master/Screenshots/alembic_example.gif

Unity 上で Alembic ファイルを再生する代物です。
Alembic とは映像業界でよく使われているファイル、およびそのライブラリで、シーン上のオブジェクトをフレーム毎に全て頂点キャッシュへ bake して格納するのに使われます。映像業界ではこれを用いてシミュレーション結果を bake してレンダラなどに渡すような使い方をするそうです。



当分仕事が映像関係になる予定なので、今後しばらくこの blog の内容もそれっぽいものになるかもしれません。AlembicImporter はまさに映像関係者向けですし、FrameCapturer も G-Buffer を exr でエクスポートしたいという要望を受けたのが始まりでした。映像方面はゲーム業界とは近いようで全く違う文化圏を持っていて、おもしろい発見が多いです。