シェーダーは、グラフィックスカードの実行のためのコードと命令が含まれたアセットです。 マテリアル はシェーダーを参照してそのパラメーター(テクスチャや色など)を設定します。
Unity にはいくつかのビルトインシェーダーが含まれており、これらはプロジェクト内でいつでも使用可能です。(例: スタンダードシェーダー) イメージエフェクト パッケージにも画像の後処理用のシェーダーが沢山含まれています。 また、シェーダーを書くことも可能です。
新しいシェーダーを作成するには、メインメニューあるいは Project ビュー のコンテキストメニューから Assets>Create>Shader を使用します。 シェーダーは C# スクリプトに似ており、 Cg/HLSL および ShaderLab 言語の組み合わせで書かれます。 (詳しくは シェーダーを書く のページを参照してください。
シェーダーのテクスチャのデフォルトを指定できる、インスペクターの項目です。このシェーダーで新しい マテリアル が作成される度にこれらのテクスチャが自動的にアサインされます。
シェーダーインスペクターは、シェーダーに関する基本的な情報(主に ShaderLab: サブシェーダータグ)を表示し、 コンパイリングおよび、低水準のコンパイル済みコードの調査が行えます。
Surface Shaders の記述 に関しては、 Show generated code (生成されたコードを表示する) ボタンで、 Unity がライティングとシャドーイングを行うために生成するすべてのコードを表示できます。 生成されるコードをカスタマイズしたい場合は、すべてをコピー&ペーストして元々のシェーダーファイルに戻せば編集を行えます。
“ Compile and show code ” ボタンのポップアップメニューから、選択されたプラットフォーム向けにコンパイルされた最終的なシェーダーコード(Direct3D9 のアセンブリや、低水準用に最適化された OpenGL ES 用の GLSL など)を確認することができます。これは主に、パフォーマンス向上のためにシェーダーを最適化する際に役立ちます ― 最終的にいくつの低水準命令が生成されるかを確認したいことも多々あるでしょう。
低水準生成コードは、GPU シェーダーパフォーマンス分析ツールにペーストするのに便利です。(AMD GPU ShaderAnalyzer や PVRShaderEditor など。) AMD GPU ShaderAnalyzer または PVRShaderEditor).
Unity は、シェーダーのインポートタイムですべてのシェーダーをコンパイルするわけではありません。なぜなら、ほとんどのシェーダーが内部に多くの バリアント を持っており、そのすべてを全部のプットフォーム用にコンパイルすると非常に時間がかかるからです。代わりに、下記の方法がとられます。
プレイヤービルドタイムでは、すべての「まだコンパイルされていない」シェーダーバリアントがコンパイルされるため、エディターがそれらを使用しなかった場合でもゲームデータに含まれることになる。
ただしこの場合、シェーダーにエラーが含まれていてそれがシェーダーインポートのときに検知されなかったことも考えられます。 例えば、Direct3D 11 を使ってエディターを実行しているが、シェーダーが OpenGL 向けにコンパイルされるエラーが発生する場合。 あるいは、シェーダーの 複数のシェーダープログラムのバリアントを作る が2.0 モデルのシェーダーの命令制限に収まらない場合などです。 こういったエラーはエディターが必要とすればインスペクター上に表示されますが、 より確実にチェックするために、必要なプラットフォーム向けにシェーダーの完全なコンパイルを手動で行うのもお勧めです。 これは、シェーダーインスペクターのポップアップメニューにある “ Compile and show code ” を使って行えます。
シェーダーのコンパイルは UnityShaderCompiler
と呼ばれるバックグラウンド処理を使って行われます。これはシェーダーをコンパイルする必要が生じるごとに Unity によって起動されるものです。プレイヤービルドタイムでのシェーダーコンパイルを並行して行うことができるように、複数のコンパイラー処理が起動されることもあります(通常は マシンの CPU コアごとに一つ)。エディターがシェーダーをコンパイルしていない間はコンパイラー処理は何も行われず、コンピューターのリソースを消費しませんのでその点を心配する必要がありません。また、Unity エディターが終了するとコンパイラー処理もシャットダウンされます。
個々のシェーダーバリアントのコンパイル結果は、プロジェクト内の Library/ShaderCache
フォルダーの中にキャッシュされています。
したがって、100% 同じシェーダーやそのスニペットは、以前のコンパイル結果を再利用します。
また、頻繁にキャッシュされるシェーダーが沢山ある場合はシェーダーキャッシュフォルダーが非常に大きくなる可能性もあります。
これはいつでも削除して問題ありません。シェーダーのバリアントが再コンパイルされるだけのことです。