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

シェーダーアセット

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

Unity にはいくつかのビルトインシェーダーが含まれており、これらはプロジェクト内でいつでも使用可能です。(例: スタンダードシェーダー) the Standard shader). You can also write your own shaders and apply post-processing effects.

新しいシェーダーの作成

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

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

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

シェーダーのテクスチャのデフォルトを指定できる、インスペクターの項目です。このシェーダーで新しい マテリアル が作成される度にこれらのテクスチャが自動的にアサインされます。 Material is created with this shader, these textures are automatically assigned.

Shader Inspector

シェーダーインスペクターは、シェーダーに関する基本的な情報(主に ShaderLab: サブシェーダータグ)を表示し、 コンパイリングや、低水準のコンパイル済みコードの調査が行えます。

Surface Shaders の記述 に関しては、 Show generated code (生成されたコードを表示する) ボタンで、 Unity がライティングとシャドーイングを行うために生成するすべてのコードを表示できます。 生成されるコードをカスタマイズしたい場合は、すべてをコピー&ペーストして元々のシェーダーファイルに戻せば編集を行えます。 and start tweaking.

シェーダーコンパイルのポップアップメニュー。
シェーダーコンパイルのポップアップメニュー。

Compile and show code ” ボタンのポップアップメニューから、選択されたプラットフォーム向けにコンパイルされた最終的なシェーダーコード(Direct3D9 のアセンブリや、低水準用に最適化された OpenGL ES 用の GLSL など)を確認することができます。これは主に、パフォーマンス向上のためにシェーダーを最適化する際に役立ちます ― 最終的にいくつの低水準命令が生成されるかを確認したいことも多々あるでしょう。 compiled shader code (e.g. assembly on Direct3D9, or low-level optimized GLSL for OpenGL ES) for selected platforms. This is mostly useful while optimizing shaders for performance; often you do want to know how many low-level instructions here generated in the end.

低水準生成コードは、GPU シェーダーパフォーマンス分析ツールにペーストするのに便利です。(AMD GPU ShaderAnalyzer や PVRShaderEditor など。) AMD GPU ShaderAnalyzer または PVRShaderEditor).

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

Unity は、シェーダーのインポートタイムですべてのシェーダーをコンパイルするわけではありません。なぜなら、ほとんどのシェーダーが内部に多くの バリアント を持っており、そのすべてを全部のプットフォーム用にコンパイルすると非常に時間がかかるからです。代わりに、下記の方法がとられます。 have a lot of variants inside, and compiling all of them, for all possible platforms, would take a very long time. Instead, this is done:

  • インポートタイムでは最小限のシェーダー処理(サーフェスシェーダーの 生成など)しか行わない。
  • シェーダーバリアントのコンパイルは必要に応じてのみ行う。
  • 多くの場合はインポートタイムで 100~10000 の内部シェーダーがコンパイルされるが、それと違って、この方法だと大抵は少数のコンパイルで済む。

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

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

シェーダーのコンパイルは UnityShaderCompiler と呼ばれるバックグラウンド処理を使って行われます。これはシェーダーをコンパイルする必要が生じるごとに Unity によって起動されるものです。プレイヤービルドタイムでのシェーダーコンパイルを並行して行うことができるように、複数のコンパイラー処理が起動されることもあります(通常は マシンの CPU コアごとに一つ)。エディターがシェーダーをコンパイルしていない間はコンパイラー処理は何も行われず、コンピューターのリソースを消費しませんのでその点を心配する必要がありません。また、Unity エディターが終了するとコンパイラー処理もシャットダウンされます。 whenever it needs to compile shaders. Multiple compiler processes can be started (generally one per CPU core in your machine), so that at player build time shader compilation can be done in parallel. While the editor is not compiling shaders, the compiler processes do nothing and do not consume computer resources, so there’s no need to worry about them. They are also shut down when Unity editor quits.

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

Further reading

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