シェーダーは、グラフィックスカードの実行のためのコードと命令が含まれたアセットです。マテリアル はシェーダーを参照してそのパラメーター (テクスチャや色など) を設定します。
Unity にはいくつかのビルトインシェーダーが含まれており、これらはプロジェクト内でいつでも使用可能です (スタンダードシェーダー など)。また、独自の シェーダーを書 いたり、ポストプロセシングエフェクト を適用することもできます。
新しいシェーダーを作成するには、メインメニューあるいは Project ビュー のコンテキストメニューから Assets > Create > Shader を使用します。シェーダーは C# スクリプトに似ており、Cg/HLSL と ShaderLab 言語の組み合わせで書かれています。詳しくは シェーダーを書く のページを参照してください。
インスペクターのこのセクションでは、シェーダーのデフォルトテクスチャを指定できます。シェーダーで新しい マテリアル を作成するときはいつでも、これらのテクスチャが自動的に割り当てられます。
シェーダーインスペクターは、シェーダーに関する基本的な情報 (主に ShaderLab: サブシェーダータグ) を表示しており、コンパイルを行ったり、低レベルのコンパイル済みコードの確認ができます。
Surface Shaders の Show generated code ボタンは、ライトとシャドウを処理するために Unity が生成するすべてのコードを表示します。生成されたコードをカスタマイズする必要がある場合は、独自のシェーダーファイルにコピーし、変更してください。
Compile and show code ボタンのドロップダウンメニューを使うと、選択したプラットフォームの最終的なコンパイル済みシェーダーコード (Direct3D9 のアセンブリ、最適化された低レベルの OpenGL ES 用の GLSL ES など) を確認することができます。これは、主に、パフォーマンスのためにシェーダーを最適化するときに有用です。多くの場合、ここで最終的にいくつの低レベルの命令が生成されているか知る必要があります。
低レベルの生成コードは、GPU シェーダーパフォーマンス分析ツールにペーストするのに便利です (AMD GPU ShaderAnalyzer や PVRShaderEditor など)。
シェーダーのインポート時には、Unity はシェーダー全部をコンパイルするわけではありません。理由は、シェーダーの大半は、内部に多くの バリアント を持っているため、それら全部を使用しそうなすべてのプラットフォームに対してコンパイルするととても長い時間がかかるからです。
プレイヤーのビルド時には、すべての「まだコンパイルされていない」シェーダーバリアントがコンパイルされるため、たまたまエディターがそれらを使用しなかった場合でもゲームデータに含まれます。
ただしこの場合、シェーダーにエラーが含まれていて、それがシェーダーインポートのときに検知されなかったことも考えられます。例えば、Direct3D 11 を使ってエディターを実行していのに、シェーダーが OpenGL 向けにコンパイルされる場合は、エラーが発生します。あるいは、シェーダーの バリアント がシェーダーモデル 2.0 の命令制限に合わない場合などです。こういったエラーは、エディターに必要であればインスペクター上に表示されます。必要なプラットフォーム向けにシェーダーを完全に手動でコンパイルして、エラーを確認するのもお勧めです。これは、シェーダーインスペクターのドロップダウンにある Compile and show code を使って行えます。
シェーダーのコンパイルは、UnityShaderCompiler
という名前のバックグラウンドプロセスを使用して実行されます。このプロセスは、シェーダーをコンパイルする必要があるときはいつでも Unity によって開始されます。複数のコンパイラー処理を起動することが可能です (通常、マシンのCPU コアごとに 1 つ)。そのため、プレイヤーのビルド時にシェーダーのコンパイルを並行して実行できます。エディターがシェーダーをコンパイルしないときは、コンパイラー処理は行われずコンピューターリソースを消費しないため、それらを心配する必要はありません。Unity エディターを終了すると、それらもシャットダウンされます。
個々のシェーダーバリアントのコンパイル結果は、プロジェクト内の Library/ShaderCache
フォルダーにキャッシュされています。つまり、100% 同じシェーダーやそのスニペットは、以前のコンパイル結果を再利用します。また、頻繁に変更されるシェーダーが多くある場合は、シェーダーキャッシュフォルダーが非常に大きくなる可能性もあります。これはいつ削除しても問題ありません。削除されたシェーダーバリアントが再コンパイルされるだけのことです。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.