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

シェーダーアセット

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

Unity contains some built-in shaders that are always available in your project (for example, the Standard shader). You can also write your own shaders and apply post-processing effects.

新しいシェーダーの作成

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

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

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

This inspector section allows specifying default textures for a shader. Whenever a new Material is created with this shader, these textures are automatically assigned.

Shader Inspector

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

For Surface Shaders, the Show generated code button displays all the code that Unity generates to handle lighting and shadowing. If you really want to customize the generated code, you can just copy and paste all of it back to your original shader file and start tweaking.

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

The pop-up menu of the Compile and show code button allows inspecting final 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).

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

On shader import time, Unity does not compile the whole shader. This is because majority of shaders 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 ” を使って行えます。

Shader compilation is carried out using a background process named UnityShaderCompiler that is started by 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% 同じシェーダーやそのスニペットは、以前のコンパイル結果を再利用します。 また、頻繁にキャッシュされるシェーダーが沢山ある場合はシェーダーキャッシュフォルダーが非常に大きくなる可能性もあります。 これはいつ削除しても問題ありません。シェーダーのバリアントが再コンパイルされるだけのことです。

さらに読み進める

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