Unity は、シェーダープログラム をコンパイルするときに、プリプロセッサーマクロをいくつか定義します。
マクロ | ターゲットプラットフォーム |
---|---|
SHADER_API_D3D9 |
Direct3D 9 |
SHADER_API_D3D11 |
Direct3D 11 |
SHADER_API_GLCORE |
デスクトップ向け OpenGL “core” (GL 3/4) |
SHADER_API_OPENGL |
旧デスクトップ向け OpenGL (GL 2) |
SHADER_API_GLES |
OpenGL ES 2.0 |
SHADER_API_GLES3 |
OpenGL ES 3.0/3.1 |
SHADER_API_METAL |
iOS/Mac Metal |
SHADER_API_D3D11_9X |
Windows Store と Windows Phone をターゲットとした Direct3D 11 の “機能レベル 9.x” |
SHADER_API_PSSL |
PlayStation 4 |
SHADER_API_XBOXONE |
Xbox One |
SHADER_API_PS3 |
PlayStation 3 |
SHADER_API_XBOX360 |
Xbox 360 |
SHADER_API_PSP2 |
PlayStation Vita |
SHADER_API_WIIU |
Nintendo WiiU |
SHADER_API_MOBILE
は、すべての一般的なモバイルプラットフォーム(GLES、GLES3、METAL、PSP2)のために定義されます。
追加で、シェーダー言語のターゲットが GLSL の場合に、SHADER_TARGET_GLSL
が定義されます。( OpenGL/GLES では常に true )
SHADER_TARGET
マクロは、shader target compilation model(シェーダーターゲットコンパイラモデル)にマッチする数値に定義します(すなわち、#pragma target
指令にマッチ)。例えば、shader model 3.0 にコンパイルするとき、SHADER_TARGET
は 30
になります。以下の例に示すように、条件つきのチェックを行うための値をシェーダーコードで使用可能です。
#if SHADER_TARGET < 30
// less than shader model 3.0:
// very limited shader capabilities, do some approximation
#else
// decent capabilities, do a better thing
#endif
UNITY_VERSION
は、Unity バージョンの数値を含みます。例えば、UNITY_VERSION
は Unity 5.0.1 では 501
になります。これは、ビルトインシェーダーの異なる機能を使うシェーダーを記述する必要がある場合、バージョン比較用に使われます。例えば、#if UNITY_VERSION >= 500
でプリプロセッサをチェックすると、バージョン 5.0.0 もしくはそれ以降のバージョンのみがパスします。
プラットフォームマクロを直接使用することは、将来性を十分考慮してないため、推奨しません。例えば、D3D9 をチェックするシェーダーを記述した場合、将来的にはチェックの範囲を広げ D3D11 も確認する必要があるかもしれません。代わりの方法として Unity では複数のヘルパーマクロが HLSLSupport.cginc
で定義されています。
マクロ | 用途 |
---|---|
UNITY_BRANCH |
条件文の前に加え、実際のブランチの内部にコンパイルされることをコンパイラに示唆します。HLSL プラットフォーム上の場合は、[branch] に展開します。 |
UNITY_FLATTEN |
条件文の前にこれを追加し、実際の分岐命令を回避するのに平坦化する必要があるということをコンパイラに示唆します。HLSL プラットフォーム上では、[flatten] に展開します。 |
UNITY_NO_SCREENSPACE_SHADOWS |
プラットフォームでカスケード式スクリーン空間シャドウマップを使用しないように定義します(モバイルプラットフォーム)。 |
UNITY_NO_LINEAR_COLORSPACE |
プラットフォームでリニアカラー空間をサポートしないように定義します(モバイルプラットフォーム)。 |
UNITY_NO_RGBM |
プラットフォームでライトマップのための RGBM 圧縮が使用されないように定義します (モバイルプラットフォーム)。 |
UNITY_NO_DXT5nm |
プラットフォームで DXT5nm のノーマルマップの圧縮を使用しないように定義します(モバイルプラットフォーム)。 |
UNITY_FRAMEBUFFER_FETCH_AVAILABLE |
framebuffer color fetch 機能が利用できる(一般的に iOS プラットフォーム - OpenGL ES 2.0, 3.0 と Metal)プラットフォームで定義します。 |
UNITY_USE_RGBA_FOR_POINT_SHADOWS |
ポイントライトのシャドウマップが、エンコードされたデプスが含まれる RGBA テクスチャを使用するプラットフォーム上で定義されます (他のプラットフォームでは、シングルチャンネルの浮動小数点テクスチャが使用されます) 。 |
UNITY_ATTEN_CHANNEL |
ライト減衰テクスチャの、どのチャネルがデータを保有するかを定義し、ピクセルごとのライティングコードで使用されます。‘r’ または’a’ のいずれかに定義されます。 |
UNITY_HALF_TEXEL_OFFSET |
プラットフォームで、ピクセル (Direct3D 9 など) に対してマッピングテクセルで 1/2 テクセルのオフセット調整が必要なことを定義します。 |
UNITY_UV_STARTS_AT_TOP |
常に 1 または 0 で定義されます。1 の値は、「テクスチャの一番上」で、テクスチャの V 座標が 0 であるプラットフォームで使用します。Direct3D のようなプラットフォームでは 1 を使用し、Open-GL のようなプラットフォームでは 0 を使用します。 |
UNITY_MIGHT_NOT_HAVE_DEPTH_TEXTURE |
手動でデプスをテクスチャにレンダリングして、プラットフォームがシャドウマップかデプステクスチャをエミュレートするか定義します。 |
UNITY_PROJ_COORD(a) |
4 成分ベクトルを渡すと、投影されたテクスチャ読み込みに適切なテクスチャ座標を戻します。殆どのプラットフォームでは渡された値そのものを戻します。 |
UNITY_NEAR_CLIP_VALUE |
ニアクリッピングプレーンの値として定義されます。Direct3D のようなプラットフォームでは 0.0 が使用され、OpenGL のようなプラットフォームでは –1.0 を使用します。 |
UNITY_VPOS_TYPE |
データ型はピクセル位置の入力(VPOS)に必要なデータ型を定義します。D3D9には float2 、その他は float4 。 |
UNITY_CAN_COMPILE_TESSELLATION |
シェーダーコンパイラが、テッセレーションシェーダーの HLSL 文法(現時点では D3D11 のみ)を「理解できる」場合に定義されます。 |
UNITY_INITIALIZE_OUTPUT(type,name) |
指定された 型 の変数 name を 0 に初期化します。 |
UNITY_COMPILER_HLSL , UNITY_COMPILER_HLSL2GLSL , UNITY_COMPILER_CG
|
シェーダーをコンパイルするのにどのシェーダーコンパイラが使用されるかを示します。それぞれ、Microsoft の HLSL、HLSL から GLSL への変換コンパイラ、NVIDIA の Cg。詳細は、Unity で使用するシェーダー言語を参照してください。コンパイラ間の差異を扱うようなシェーダー構文のとても特別でまれなケースに遭遇し、それぞれのコンパイラに異なるコードを書く必要がある場合は、これを使用してください。 |
シャドウマップの宣言およびサンプリングはプラットフォームにより大きくことなる場合があるため、Unity にはこれをサポートするマクロが複数あります。
マクロ | 用途 |
---|---|
UNITY_DECLARE_SHADOWMAP(tex) |
tex という名前のシャドウマップテクスチャ変数を宣言します。 |
UNITY_SAMPLE_SHADOW(tex,uv) |
tex という名前のシャドウマップテクスチャを特定の uv 座標にサンプリングします( XY コンポーネントはテクスチャの場所、Z コンポーネントは相対的なデプス)。0 - 1 の範囲でシャドウとしてひとつの float 変数を戻します。 |
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) |
上記と同様ですが、投影法のシャドウマップ読み込みを行います。uv は float4 であり、他のすべてのコンポーネントはルックアップをするために .w で除算します。 |
Direct3D 11 はすべてのシェーダー変数を “constant buffer” (定数バッファ)にグループ分けします。Unity ビルトインの変数のほとんどはすでにグループ分けされてますが、自身で作成するシェーダーの変数については、予想される更新頻度に応じて、別の constant buffer に格納することが最適です。
CBUFFER_START(name)
と CBUFFER_END
マクロをその場合に使用します。
CBUFFER_START(MyRarelyUpdatedVariables)
float4 _SomeGlobalValue;
CBUFFER_END
テクスチャとサンプラーペアを宣言する場合、通常、シェーダーコードに texture2D
を使用します。
しかし、いくつかのプラットフォーム(DX11 など)では、テクスチャとサンプラーは別々のオブジェクトで、
最大可能サンプラー数はきわめて限られています。Unity はサンプラーなしでテクスチャを宣言するマクロをいくつか有しています。
また、それらのマクロで別のテクスチャからサンプラーを使用してテクスチャをサンプリングすることもできます。
サンプラーの限界に達してしまい、いくつかのテクスチャが、
実際、サンプラーを共有できる場合 (サンプラーによってテクスチャフィルタリングとラッピングモードが決定されます)、このマクロを使用できます。
マクロ | 用途 |
---|---|
UNITY_DECLARE_TEX2D(name) |
テクスチャとサンプラーのペアを宣言します。 |
UNITY_DECLARE_TEX2D_NOSAMPLER(name) |
サンプラーなしでテクスチャを宣言します。 |
UNITY_DECLARE_TEX2DARRAY(name) |
テクスチャ配列のサンプラー変数を宣言します。 |
UNITY_SAMPLE_TEX2D(name,uv) |
指定されたテクスチャ座標を使用してテクスチャとサンプラーのペアからサンプリングします。 |
UNITY_SAMPLE_TEX2D_SAMPLER( name,samplername,uv) |
別のテクスチャ(samplername)からサンプラーを使用してテクスチャ(name)からサンプリングします。 |
UNITY_SAMPLE_TEX2DARRAY(name,uv) |
float3 UV のテクスチャ配列からサンプリングします。座標の z コンポーネントは配列エレメントインデックスです。 |
UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) |
明白なミップマップレベルが設定されたテクスチャ配列からサンプリングします。 |
サーフェスシェーダー がコンパイルされるとき、ライティングをするために、さまざまなパス向けに大量のコードを生成することになります。各パスをコンパイルするとき、次のうちのいずれかのマクロが定義されます。
マクロ | 用途 |
---|---|
UNITY_PASS_FORWARDBASE |
フォワードレンダリングのベースパス(メインの指向性ライト、ライトマップ、SH ) |
UNITY_PASS_FORWARDADD |
フォワードレンダリングの追加パス(パスごとにひとつのライト) |
UNITY_PASS_DEFERRED |
Deferred シェーディングパス(G-Buffer でレンダリングされる) |
UNITY_PASS_SHADOWCASTER |
シャドウキャスターとデプステクスチャレンダリングパス |
UNITY_PASS_PREPASSBASE |
旧 deferred ライティングのベースパス(法線や鏡面反射指数をレンダリングします) |
UNITY_PASS_PREPASSFINAL |
旧 deferred ライティングの最終的なパス(ライティングとテクスチャに適用されます) |