DX11 / OpenGL コアテッセレーションのサーフェースシェーダー
Vertex and fragment shader examples

頂点シェーダーとフラグメントシェーダーのプログラミング

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

If you want to write shaders that interact with lighting, take a look at Surface Shaders documentation. For some examples, take a look at Vertex and Fragment Shader Examples. The rest of this page assumes shaders do not interact with Unity lights (for example special effects, post-processed effects etc.)

Shader programs are written in HLSL language, by embedding “snippets” in the shader text, somewhere inside the Pass command. They usually look like this:

  Pass {
      // ... the usual pass state setup ...
      
      CGPROGRAM
      // compilation directives for this snippet, e.g.:
      #pragma vertex vert
      #pragma fragment frag
      
      // the Cg/HLSL code itself
      
      ENDCG
      // ... the rest of pass setup ...
  }

HLSL snippets

HLSL program snippets are written between CGPROGRAM and ENDCG keywords, or alternatively between HLSPROGRAM and ENDHLSL. The latter form does not automatically include HLSLSupport and UnityShaderVariables built-in header files.

スニペットで、コンパイラディレクティブは #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 のドメインシェーダーとしてコンパイル。このオプションがあると、自動的に後述の #pragma target 5.0 をオンにします。

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

  • #pragma target name - コンパイルするシェーダーターゲットの指定。詳細は シェーダーコンパイルターゲットレベル を参照してください。
  • #pragma only_renderers space separated names - 指定のレンダラー用にのみシェーダーをコンパイルします。デフォルトではすべてのレンダラー用にシェーダーがコンパイルされます。詳細は後述の Renderers を参照してください。
  • #pragma exclude_renderers space separated names - 指定のレンダラーにのみシェーダーをコンパイルしません。デフォルトではすべてのレンダラー用にシェーダーがコンパイルされます。詳細は Renderers を参照してください。
  • #pragma multi_compile … - マルチシェーダーバリアント とともに動作します。
  • #pragma enable_d3d11_debug_symbols - DirectX 11 用にコンパイルされたシェーダーのデバッグ情報を生成します。これにより、Visual Studio 2012 (またはそれ以降のバージョン)のグラフィックスデバッガを経由してシェーダーのデバッグが可能になります。
  • #pragma hardware_tier_variants renderer name - 選択されたレンダラーを実行する各ハードウェア階層のために、コンパイルしたシェーダーごとの 複数シェーダーハードウェアバリアント を生成します。詳細は、後述の Renderers を参照してください。

それぞれのスニペットには最低でも頂点プログラムとフラグメントプログラムが含まれていなければいけません。それゆえに #pragma vertex#pragma fragment 命令が必要になります。

Unity 5.0 上で実行しても何も起こらないコンパイル命令で、安全に削除できるもの: #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 feature level, as commonly used on WSA platforms
  • xboxone - Xbox One
  • ps4 - PlayStation 4
  • psp2 - PlayStation Vita
  • n3ds - Nintendo 3DS
  • wiiu - Nintendo Wii U

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

#pragma only_renderers d3d9

関連項目

DX11 / OpenGL コアテッセレーションのサーフェースシェーダー
Vertex and fragment shader examples