見出し画像

ShaderGraphで”できないこと”から考える、実践的な活用法 #ポケテク

こんにちは!ポケラボのテクニカルアーティスト礒部です。

今回のポケテクでは、ShaderGraphでは”できないこと・苦手なこと”を整理した上で、どのようにShaderGraphを利用すればよいのかについて考えてみます!



ShaderGraphができないこと・苦手なこと

できないこと①:マルチパス・カスタムパス

「ShaderGraphでトゥーンシェーダーを書きたい!」という希望を持った多くのShaderGraph初心者を困らせるのが、マルチパスはShaderGraphでは実装できないという問題です。
既存のコードで書かれたトゥーンシェーダーを読んだことがある人ならお分かりになるかと思いますが、トゥーンシェーダーの多くは通常のテクスチャを貼り付けたり、シェーディングしたりといったモデル描画のパスと、背面法を用いたアウトライン用のパスに分かれていることがほとんどです。ShaderGraphではこういった一つのシェーダーで複数のパスを実装することはできません。シェーディング用とアウトライン用のシェーダーを2つ用意し、2つのマテリアルを同一のメッシュに重複して適用することで擬似的にマルチパスのような実装も可能ですが、そのメッシュが部位ごとにマテリアルが分かれているなどの場合のように複数マテリアルをすでに持っていたら不可能です。

もしコードで書かれたトゥーンシェーダの実装を学んでみたい時はUnity Japanが提供してくれているUTSを参考に読み解いてみるといいでしょう。


できないこと②:ステンシル

シェーダーにはステンシルバッファを参照して描画するかどうかを決めたり、またステンシルバッファに書き込んだりする機能があります。
ステンシルは特殊な表現をしたいときにしばしば用いられるのですが(トンネルの中にいるキャラクターが見えるように、円形にくりぬいて描画する…など)、ShaderGraphでは参照することも書き込むこともできません。

ですが、Render Objectsという内蔵のRendererFeatureを使って、近しい表現はできるようになります。ShaderGraphをメインで使っているがステンシルも利用したい時はこちらにチャレンジしてみるのもいいでしょう。
以下はステンシルは使用していませんが、Render Objectsについて解説したUnityの記事になります。


苦手なこと①:大きくて複雑なシェーダーではエディターが重くなる

ShaderGraphを使って、ある程度の大きさのShaderGraphを作ったことがある人なら理解いただけると思いますが、大きくなればなるほど開発QoLが下がっていきます。
特に辛いのは「取り消し(Ctrl+Z)」を押した時で、肥大化したShaderGraphでは一回の取り消しで30秒程度待つこともあります。ノードを繋ぎ間違えてついうっかり取り消しを押してしまうと、長時間待たされることがしばしばあり、自分はこれに困っています。
Unity2022のテックストリームのリリースノートをみる限りでは、ShaderGraphのQoL改善に努められているようで、自分も最新のShaderGraphをちゃんと触っているわけではありませんが、コードで書いたならコンパイルを待っても7,8秒程度だと思うので、ここは現時点では明確な弱点と言えるでしょう。


苦手なこと②:かゆいところには手が届かない

たとえば「Litなシェーダーだけど、Fogはオフにしたい」というニッチな表現上の要望があったとします。が、ShaderGraphではこれはお手軽にはできません。GraphInspector内にFogをオフにするオプションがあってもいいような気がするのですが、これがないため、LitなShaderGraphでは甘んじてFogの影響を受けることになります。


ここまで、ShaderGraphのネガティブなポイントを見てきました。では逆にどんな用途ならShaderGraphは適していると言えるのでしょうか?

ShaderGraphの適した用途

シェーダー初心者が最初に学ぶシェーダー作成ツール

シェーダーを学び始めた初心者には特にお勧めできます。とはいえShaderGraphではできないこともあるんじゃないの?という意見もあるでしょうし、実際にさきほどはあえてできないことを挙げましたが、逆に言えばそれ以外のことはほとんどできるのです。

コードでシェーダーを書く際にはとにかく事前知識を多く要求されます。まずはShaderlabというUnityがシェーダーをコードで書くために用意した”お作法”のようなものを学び、次にGLSL/HLSLなどのシェーダー言語の関数や、各レンダーパイプラインが用意したAPIなども学ぶ必要があります。そういったことの勉強を苦に感じてしまうが、シェーダーは学んでみたい…という方にはShaderGraphはおすすめです。

とにかく早くルックを作りたい時

コードで書くよりもShaderGraphで書いた方が書き出しの初速は間違いなく早いです。先ほども述べた通り、Shaderlabの形式や、レンダーパイプラインのAPIを調べ直す必要がないからです。
マテリアルで調整するパラメータひとつをとっても、ShaderGraphではBlackboard上で作成してドラッグ&ドロップですぐにシェーダー内で使えます。
とにかく早くルックを作りたい時、つまりルック開発のフェーズではShaderGraphは大いに活躍します。

しかしながら前述の通り、シェーダーの機能が肥大化し大規模化していった時(参照:サムネイルの背景画像)にはエディタ上でのQoLが著しく下がります。また、ルック開発の結果マルチパスを使用したくなるかもしれません。そういった時はコードで書き直すとよいと考えます。

まとめ

今回のポケテクではShaderGraphのネガティブなポイント、できないことや苦手なことを考えつつ、ShaderGraphの実践的な活用方法について紹介しました。

次回はシェーダーで頻出する”ノイズ”について、単調な表現を避けるためのTipsを共有したいと思います。お楽しみに!


ポケラボでは3D関連職種をはじめ新規開発を一緒に推進いただける仲間を募集しています。少しでもポケラボに興味をもっていただいた方は、カジュアルなご相談からでも大歓迎なので、お気軽にご連絡ください!

株式会社ポケラボ 採用サイト

カジュアル面談をご希望の方はこちら


みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!