Version: 2019.4
言語: 日本語
ShaderLab: その他のコマンド
詳細な ShaderLab トピック

シェーダーアセット

シェーダーは、グラフィックスカードの実行のためのコードと命令が含まれたアセットです。マテリアル はシェーダーを参照してそのパラメーター (テクスチャや色など) を設定します。

Unity にはいくつかのビルトインシェーダーが含まれており、これらはプロジェクト内でいつでも使用可能です (スタンダードシェーダー など)。また、独自の シェーダーを書 いたり、ポストプロセシングエフェクト を適用することもできます。

新しいシェーダーの作成

新しいシェーダーを作成するには、メインメニューあるいは Project ビュー のコンテキストメニューから Assets > Create > Shader を使用します。シェーダーは C# スクリプトに似ており、Cg/HLSL と ShaderLab 言語の組み合わせで書かれています。詳しくは シェーダーを書く のページを参照してください。

シェーダーインスペクター
シェーダーインスペクター

シェーダーのインポート設定

インスペクターのこのセクションでは、シェーダーのデフォルトテクスチャを指定できます。シェーダーで新しい マテリアル を作成するときはいつでも、これらのテクスチャが自動的に割り当てられます。

シェーダーインスペクター

シェーダーインスペクターは、シェーダーに関する基本的な情報 (主に ShaderLab: サブシェーダータグ) を表示しており、コンパイルを行ったり、低レベルのコンパイル済みコードの確認ができます。

Surface ShadersShow generated code ボタンは、ライトとシャドウを処理するために Unity が生成するすべてのコードを表示します。生成されたコードをカスタマイズする必要がある場合は、独自のシェーダーファイルにコピーし、変更してください。

シェーダーコンパイルのメニュー。
シェーダーコンパイルのメニュー。

Compile and show code ボタンのドロップダウンメニューを使うと、選択したプラットフォームの最終的なコンパイル済みシェーダーコード (Direct3D9 のアセンブリ、最適化された低レベルの OpenGL ES 用の GLSL ES など) を確認することができます。これは、主に、パフォーマンスのためにシェーダーを最適化するときに有用です。多くの場合、ここで最終的にいくつの低レベルの命令が生成されているか知る必要があります。

低レベルの生成コードは、GPU シェーダーパフォーマンス分析ツールにペーストするのに便利です (AMD GPU ShaderAnalyzerPVRShaderEditor など)。

シェーダーコンパイルの詳細

シェーダーのインポート時には、Unity はシェーダー全部をコンパイルするわけではありません。理由は、シェーダーの大半は、内部に多くの バリアント を持っているため、それら全部を使用しそうなすべてのプラットフォームに対してコンパイルするととても長い時間がかかるからです。

  • インポート時には最小限のシェーダー処理 (サーフェスシェーダーの 生成など) を行います。
  • シェーダーバリアントのコンパイルは、実際に必要な場合にのみ行います。
  • インポート時に 100~10000 の内部シェーダーをコンパイルすることは一般的ですが、Unity ではそうする代わりに、大抵は少数のコンパイルで済みます。

プレイヤーのビルド時には、すべての「まだコンパイルされていない」シェーダーバリアントがコンパイルされるため、たまたまエディターがそれらを使用しなかった場合でもゲームデータに含まれます。

ただしこの場合、シェーダーにエラーが含まれていて、それがシェーダーインポートのときに検知されなかったことも考えられます。例えば、Direct3D 11 を使ってエディターを実行していのに、シェーダーが OpenGL 向けにコンパイルされる場合は、エラーが発生します。あるいは、シェーダーの バリアント がシェーダーモデル 2.0 の命令制限に合わない場合などです。こういったエラーは、エディターに必要であればインスペクター上に表示されます。必要なプラットフォーム向けにシェーダーを完全に手動でコンパイルして、エラーを確認するのもお勧めです。これは、シェーダーインスペクターのドロップダウンにある Compile and show code を使って行えます。

シェーダーのコンパイルは、UnityShaderCompiler という名前のバックグラウンドプロセスを使用して実行されます。このプロセスは、シェーダーをコンパイルする必要があるときはいつでも Unity によって開始されます。複数のコンパイラー処理を起動することが可能です (通常、マシンのCPU コアごとに 1 つ)。そのため、プレイヤーのビルド時にシェーダーのコンパイルを並行して実行できます。エディターがシェーダーをコンパイルしないときは、コンパイラー処理は行われずコンピューターリソースを消費しないため、それらを心配する必要はありません。Unity エディターを終了すると、それらもシャットダウンされます。

個々のシェーダーバリアントのコンパイル結果は、プロジェクト内の Library/ShaderCache フォルダーにキャッシュされています。つまり、100% 同じシェーダーやそのスニペットは、以前のコンパイル結果を再利用します。また、頻繁に変更されるシェーダーが多くある場合は、シェーダーキャッシュフォルダーが非常に大きくなる可能性もあります。これはいつ削除しても問題ありません。削除されたシェーダーバリアントが再コンパイルされるだけのことです。

参考資料

ShaderLab: その他のコマンド
詳細な ShaderLab トピック