DX11 / OpenGL コアテッセレーションのサーフェスシェーダー
頂点シェーダーとフラグメントシェーダーの例

Writing vertex and fragment shaders

ShaderLab シェーダーは単なるハードウェアシェーダー以上の機能を含み、さまざまなことができます。ShaderLab シェーダーは Material インスペクターに表示されたプロパティーを説明し、異なるグラフィックスのハードウェア用の複数のシェーダー実装を含み、固定関数のハードウェア状態を設定するなど、を行います。実際のプログラマブルシェーダー(頂点シェーダーやフラグメントシェーダーのプログラムなど)は ShaderLab のシェーダーのコンセプトの単なる一部です。導入的な説明は、シェーダー: 頂点とフラグメントプログラム を参照してください。ここでは低レベルなハードに近いシェーダーを シェーダープログラム と呼ぶことにします。

ライティングと相互作用するシェーダーを作成する場合は、サーフェスシェーダー のドキュメントを参照してください。。いくつか例を見るには 頂点シェーダーとフラグメントシェーダーの例 を参照してください。このページの残りの部分は、シェーダーが Unity のライトと相互作用しないことを前提としています (例えば、特殊効果、ポストプロセスエフェクト など)。

シェーダープログラムは HLSL 言語 で記述され、シェーダーテキストに「スニペット」を埋め込んでPass コマンドの任意の場所に置かれます。 以下のようになります。

  Pass {
        // ...通常の pass  設定...

        CGPROGRAM
        // このスニペットのコンパイラーディレクティブ。例:
        #pragma vertex vert
        #pragma fragment frag

        // the Cg/HLSL code itself

        ENDCG
        // ... pass  設定の残り ...
    }

HLSL スニペット

HLSL プログラムスニペットは CGPROGRAMENDCG のキーワードの間、または、HLSLPROGRAMENDHLSL の間に書きます。2 番目の形式では、自動的には HLSLSupport と UnityShaderVariables ビルトインヘッダーファイル含まれません

スニペットの開始で、コンパイラーディレクティブは #pragma ステートメントではじまります。ディレクティブはどのシェーダー関数を使ってコンパイルするかを示します。

  • #pragma vertex name - compile function name as the vertex shader.
  • #pragma fragment name - compile function name as the fragment shader.
  • #pragma geometry name - compile function name as DX10 geometry shader. Having this option automatically turns on #pragma target 4.0, described below.
  • #pragma hull name - compile function name as DX11 hull shader. Having this option automatically turns on #pragma target 5.0, described below.
  • #pragma domain name - compile function name as DX11 domain shader. Having this option automatically turns on #pragma target 5.0, described below.

その他のコンパイラーディレクティブ

  • #pragma target name - コンパイルするシェーダーターゲットの指定。詳細は シェーダーコンパイルターゲットレベル を参照してください。
  • #pragma only_renderers space separated names - compile shader only for given renderers. By default shaders are compiled for all renderers. See Renderers below for details.
  • #pragma exclude_renderers space separated names - do not compile shader for given renderers. By default shaders are compiled for all renderers. See Renderers below for details.
  • #pragma multi_compile … - マルチシェーダーバリアント とともに動作します。
  • #pragma enable_d3d11_debug_symbols - DirectX 11 用にコンパイルされたシェーダーのデバッグ情報を生成します。これにより、Visual Studio 2012 (またはそれ以降のバージョン)のグラフィックスデバッガを経由してシェーダーのデバッグが可能になります。
  • #pragma hardware_tier_variants renderer name - generate multiple shader hardware variants of each compiled shader, for each hardware tier that could run the selected renderer. See Renderers below for details.

Each snippet must contain at least a vertex program and a fragment program. Thus #pragma vertex and #pragma fragment directives are required.

Compilation directives that don’t do anything starting with Unity 5.0 and can be safely removed: #pragma glsl, #pragma glsl_no_auto_normalization, #pragma profileoption, #pragma fragmentoption.

レンダリングプラットフォーム

Unity はいくつかのレンダリング API (例えば Direct3D 9 と OpenGL) をサポートしており、デフォルトではすべてのシェーダープログラムは、サポートされているすべてのレンダラーにコンパイルされます。どのレンダラーが #pragma only_renderers または #pragma exclude_renderers ディレクティブを使用してコンパイルするかを指定できます。これは、一部のプラットフォームでは使用不可であることが分かっているシェーダー言語の機能を、明示的に使用する場合に最も役立ちます。サポートされているレンダラー名は以下のとおりです。

  • d3d9 - Direct3D 9
  • d3d11 - Direct3D 11/12
  • glcore - OpenGL 3.x/4.x
  • gles - OpenGL ES 2.0
  • gles3 - OpenGL ES 3.x
  • metal - iOS/Mac Metal
  • vulkan - Vulkan
  • d3d11_9x - Direct3D 11 9.x 機能レベル (WSA プラットフォームで一般に使用されている)
  • xboxone - Xbox One
  • ps4 - PlayStation 4
  • psp2 - PlayStation Vita
  • n3ds - Nintendo 3DS
  • wiiu - Nintendo Wii U

例えば、次の行は、シェーダーを D3D9 モードでのみコンパイルします。

#pragma only_renderers d3d9

参照

DX11 / OpenGL コアテッセレーションのサーフェスシェーダー
頂点シェーダーとフラグメントシェーダーの例