関連記事
概要
2018年8月11日、VRChat内で「JAPANELAND花火大会」というイベントがありました。
空中からいい具合に撮影したやつがなぜか保存されていなかった。。。地上からの見え方はこんな感じです!
みんな表現がめちゃめちゃ綺麗
そして花火会場が混まないから好きな位置から見れるし、ゴーグル外せばすぐ帰れるのもVRの魅力の一つですねw pic.twitter.com/d7YQIcpALN— ARおじさん (@AR_Ojisan) August 11, 2018
(イベントのアーカイブはこちら)
大変にエモいですね。この表現を支えているのがシェーダ芸であり、本稿のテーマです。
VRChatをプレイしていて、シェーダ芸やってみたい、と思っている方の助けになれば幸いです。
なお全体像を掴むための説明なので、より詳しい説明については参考資料をご覧ください。またこの続きの記事はサンプルコードの準備が出来次第、公開する予定です。
シェーダ
そもそもシェーダとは
Unityなどで3Dモデルを扱ったことがあれば1度は聞いたことがあると思います。shaderファイルとして存在し、Materialにくっつけて使うアレです。
一言でいうと、「ゲーム空間に存在する3Dデータを、画面に写す時に様々な効果を与えるフィルター」と言ったものになります。
例えば光源効果を与えたり、透過処理をしたり、縁取りなどアニメ調に変化させたり、旗や水面をなびかせたりと様々な使い方ができます。UTS2(ユニティちゃんトゥーンシェーダ)が有名です。
シェーダ芸とは
上記は通常の用途ですが、そこから外れた使い方をしているとシェーダ芸と呼ばれます。
極めると、本来の使い方からは想像もつかないようなものを作ることができます。例えば絵を描いたり、パーティクルにしたり、計算機を作ったり、果てはゲームを作ったりできます。
GPUパーティクルとは
シェーダ芸のうち、モデルをパーティクルに変化させて利用するのがGPUパーティクルです。最初の動画に写っていもの、つまり本稿で説明したいもの、ズバリそのものです。
通常のパーティクル(ParticleSystem)がCPUを利用して描画しているのに対し、GPUによって描画される(シェーダはGPUで処理されます)ためGPUパーティクルと呼ばれます。
VRChatでParticleSystemは使えない?
使えます。むしろ作りやすさ、扱いやすさ、資料の多さなどについては圧倒的にParticleSystemの方が良いです。
しかしVRChatにおいては負荷や同期ずれなどの問題から、GPUパーティクルを利用するケースが多いようです。
コンピュートシェーダ
GPUパーティクルで検索すると、コンピュートシェーダ(Compute Shader)が引っかかることがあります。実はGPUパーティクルはシェーダ以外でも実現することができ、それがこの技術です。
Compute Shaderを動かすためにC#スクリプトが必要なのですが、VRChatではC#スクリプトを持ち込む事が出来ないという制限があるため、利用する事が出来ません。
またシェーダと言うわりにはシェーダではありません。恐らくシェーダ同様GPUを使って処理するため(記法もシェーダにそっくり)かと予想しています。
シェーダの中身
シェーダファイル(.shader)の中身はShaderLab言語で描かれています。これはCg言語(NVIDIA製)とHLSL言語(MS製、Cgの後継)の組み合わせで出来ています。(※追記:シェーダ言語であるCgやHLSLと、それをUnityとつなぐShaderLab言語の組み合わせ、が近い)そのため、コードについては過去の資産が利用できます。が、GPUパーティクルとしてのコードはレアかもしれません。
注意点
シェーダは頂点シェーダやフラグメントシェーダなど、幾つかの要素で構成されています。紛らわしいのですが、シェーダを組み合わせた完成品もシェーダと呼ぶので、これ以降は以下のように書き分けます。
- shader = シェーダの構成要素
- シェーダ = shaderを組み合わせた完成品
Vertex Shader(頂点シェーダ)
基本となる2つのshaderのうち1つ。その名の通り、主に3Dモデルの頂点に対して移動を行います。旗や水面を揺らしたりできます。
Fragment Shader(フラグメントシェーダ)
基本となる2つのshaderのうち1つ。ポリゴンの面を塗ります。指定色で塗りつぶしたり、影をつけたり、透過したりできます。ピクセルシェーダとも呼ばれます。
Geometry Shader(ジオメトリシェーダ)
シェーダ芸のキモとなるshaderです。3Dモデルを各ポリゴンに分割して移動や変形を行う事ができます。1ポリゴンを1パーティクルと見立てて移動を行うことで、GPUパーティクルを実現します。
まとめ
GPUパーティクルは、Geometry Shaderを駆使することで実現しています。
通常のシェーダではあまり見られない使い方をするため、シェーダ芸と呼ばれています。
習得すれば主にVRChatで大変にエモい絵を作れます。
更に詳しい内容についてはまた後日まとめます。それまで待てないという方は、以下の資料を御覧ください。
追加資料
自分の経験から、以下の資料を上から順番に読んで行くのをお勧めします。
Unity Shader Programming Vol.01 – BOOTH
シェーダがどんなもので、どんなことをしているのか、中身がどうなっているのか、という初歩的な部分がわかります。シェーダって何?というレベルから、.shaderファイルの中身をなんとなく読み書きできる程度になれます。内容も絞ってあり、実際に手を動かしてみる項目もあるので、最初の一歩に最適です。
Unity プログラミング・バイブル(No.07)(追記)
上記の本より少ない内容ですが、基礎的な部分が書いてあります。既にお持ちの場合は最初に読んでみるとよいでしょう。.shaderファイルをなんとなく読めるようになります。
ジオメトリシェーダ入門 – e.blog
GPUパーティクルではGeometory Shaderを主に使いますが、上記の本では扱われていません。逆にこの記事にはそれ以外の部分の説明がありません。よって上記の本を読み終えたあとにこの解説を見るのがいいです。
FuwaParticle
シェーダ芸で有名なphi16さんが公開されているサンプルです。単純な構造のGPUパーティクルなので弄ってみるのに丁度良いです。
アレ
同じくphi16さんが(半)公開しているサンプルと解説です。部分的な公開になっていますが、ここまでの内容がわかっていれば(FuwaParticle等に)移植できます。
おまけ
Gotanda.unity#8(詳しくはまとめ記事参照)で発表した時の資料です。内容的には本稿とほぼ同じですが、ネタ寄り物語寄りの構成なので気楽にみて(周りに勧めて)もらえるといいと思います。またボツになって本番では出さなかったスライドが最後に残ってます(笑)