ShaderLab シェーダーは、マテリアルインスペクターが表示するプロパティを記述し、さまざまなグラフィックスハードウェアのための複数のシェーダー実装を含み、固定関数ハードウェアの状態を設定します。頂点プログラムやフラグメントプログラムのようなプログラム可能なシェーダーは ShaderLab のシェーダーコンセプトの一部にすぎません。シェーダーの詳細と概要については、 シェーダーチュートリアル を参照してください。このページでは、低レベルハードウェアシェーダー シェーダープログラム の概要を説明します。
**ライティングと相互作用するシェーダーを作成する場合は、サーフェスシェーダー のドキュメントを参照してください。いくつか例を見るには 頂点シェーダーとフラグメントシェーダーの例 を参照してください。このページの残りの部分は、シェーダーが Unity のライトと相互作用 (例えば、特殊効果、ポストプロセスエフェクト など) しないことを前提としています。
シェーダープログラムは HLSL 言語 で記述され、シェーダーテキストに “スニペット” を埋め込んで Pass コマンド内に置かれます。通常は以下のようになります。
Pass {
// ...通常の pass 設定...
CGPROGRAM
// このスニペットのコンパイラーディレクティブ。例:
#pragma vertex vert
#pragma fragment frag
// Cg/HLSL コード自体
ENDCG
// ... pass 設定の残り ...
}
HLSL プログラムスニペットは CGPROGRAM
と ENDCG
のキーワードの間、または、HLSLPROGRAM
と ENDHLSL
の間に記述します。2 番目の形式では、自動的には HLSLSupport と UnityShaderVariables ビルトインヘッダーファイル は含まれません。
スニペットの最初に、コンパイルディレクティブを #pragma
ステートメントとして指定できます。次の表は、コンパイルするシェーダー関数を示すディレクティブの概要です。
ステートメント | 機能 |
---|---|
#pragma vertex name |
頂点 シェーダーとして関数 name をコンパイルします。 |
#pragma fragment name |
フラグメントシェーダーとして関数 name をコンパイルします。 |
#pragma geometry name |
関数 name をDX10 ジオメトリシェーダーとしてコンパイルします。以下の表で説明するように、このオプションは自動的に #pragma target 4.0 をオンにします。 |
#pragma hull name |
関数 name をDX11 hull シェーダーとしてコンパイルします。以下の表に示すように、このオプションは自動的に #pragma target 5.0 オンにします。 |
#pragma domain name |
関数 name をDX11 domain シェーダーとしてコンパイルします。以下の表に示すように、このオプションは自動的に #pragma target 5.0 オンにします。 |
ステートメント | 機能 |
---|---|
#pragma target name |
コンパイルするシェーダー ターゲットを設定します。詳細については、シェーダーコンパイルターゲット のドキュメントを参照してください。 |
#pragma require feature ... |
GPU がシェーダーに必要とする細かい制御 。詳細については、シェーダーコンパイルターゲット のドキュメントを参照してください。 |
#pragma only_renderers space separated names |
指定したレンダラー専用のコンパイルシェーダー 。デフォルトでは、すべてのレンダラー用にシェーダーがコンパイルされます。 |
#pragma exclude_renderers space separated names |
指定されたレンダラーのシェーダーをコンパイルしません。 デフォルトでは、すべてのレンダラーのシェーダーがコンパイルされます。 |
#pragma multi_compile ... |
複数のシェーダー バリアント を使用する場合に使用します。未使用のバリアント multi_compile シェーダーは、ゲームのビルドに含まれています。 |
#pragma multi_compile_local ... |
このステートメントは multi_compile に似ていますが、列挙されたキーワードはローカルです。詳しくは、複数のシェーダープログラムバリアント: キーワード制限 を参照してください。 |
#pragma shader_feature ... |
複数のシェーダーバリアント を使用する場合に使用します。未使用のバリアント shader_feature シェーダーは、ゲームビルドに含まれていません。 |
#pragma shader_feature_local ... |
このステートメントは shader_feature と似ていますが、列挙型のキーワードはローカルです。参照する複数のシェーダーのバリアント:キーワードは、制限の詳細については、 ドキュメント 。 |
#pragma enable_d3d11_debug_symbols |
DirectX 11 用にコンパイルされたシェーダーのデバッグ情報を生成します。これにより、Visual Studio 2012 (またはそれ以降) のグラフィックスデバッガーを使用してシェーダーをデバッグできます。 |
#pragma hardware_tier_variants renderer name |
選択したレンダラーを実行できる各ハードウェア階層用にシステムがコンパイルする各シェーダーの 複数のシェーダーハードウェアバリアントを生成します。 |
#pragma hlslcc_bytecode_disassembly |
非アセンブリ化した HLSLcc バイトコードを変換したシェーダーに埋め込みます。 |
#pragma disable_fastmath |
NaN 処理を含む正確な IEEE 754 規則を有効にします。現在、これは Metal プラットフォームにのみ影響します。 |
#pragma glsl_es2 |
GLSL シェーダーで設定すると、 シェーダー ターゲットが OpenGL ES 3 の場合でも、GLSL ES 1.0 (OpenGL ES 2.0) を生成します。 |
#pragma editor_sync_compilation |
同期コンパイルを強制します。これは Unity エディターにのみ影響します。 |
#pragma enable_cbuffer |
現在のプラットフォームが定数バッファをサポートしていない場合でも、HLSLSupport から CBUFFER_START(name) と CBUFFER_END マクロを使用する場合に cbuffer(name) を放出します。 |
それぞれのスニペットには最低でも頂点プログラムとフラグメントプログラムが含まれていなければいけません。それゆえに #pragma vertex
と #pragma fragment
命令が必要になります。
以下のコンパイルディレクティブは何もせず、安全に削除できます。
#pragma glsl
#pragma glsl_no_auto_normalization
#pragma profileoption
#pragma fragmentoption
Unity は #pragma
ディレクティブのみをシェーダーファイルでサポートし、インクルードファイルではサポートしません。
UnityはDirect3D 11やOpenGLのようないくつかのレンダリングAPIをサポートし、 デフォルトですべてのシェーダープログラムをサポートされているレンダラーにコンパイルします。 #pragma only_renderers
または #pragma exclude_renderers
ディレクティブを使用して、コンパイルするレンダラーを指定できます。これは、一部のプラットフォームでは使用できないシェーダー言語機能を使用する場合に便利です。サポートされているレンダラー名は以下のとおりです。
ステートメント | Renderer |
---|---|
d3d11 |
Direct3D 11/12 |
glcore |
OpenGL 3.x / 4.x |
gles |
OpenGL ES 2.0 |
gles3 |
OpenGL ES 2.0 |
metal |
iOS/Mac Metal |
vulkan |
Vulkan |
d3d11_9x |
WSAプラットフォームで一般的に使用されるDirect3D 11 9.x機能レベル |
xboxone |
Xbox One |
ps4 |
PlayStation 4 |
n3ds |
Nintendo 3DS |
wiiu |
Nintendo Wii U |
以下の例では、この行はシェーダーを D3D11 モードにのみコンパイルします。
# pragma only_renderers d3d11