DX11 / OpenGL コアテッセレーションのサーフェスシェーダー


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 ...
        // compilation directives for this snippet, e.g.:
        #pragma vertex vert
        #pragma fragment frag
        // the Cg/HLSL code itself
        // ... the rest of pass setup ...

HLSL snippets

HLSL program snippets are written between CGPROGRAM and ENDCG keywords, or alternatively between HLSLPROGRAM 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 supports several rendering APIs (e.g. Direct3D 11 and OpenGL), and by default all shader programs are compiled into all supported renderers. You can indicate which renderers to compile to using #pragma only_renderers or #pragma exclude_renderers directives. This is mostly useful in cases where you are explicitly using some shader language features that you know aren’t possible on some platforms. Supported renderer names are:

  • 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

For example, this line would only compile shader into D3D11 mode:

#pragma only_renderers d3d11


DX11 / OpenGL コアテッセレーションのサーフェスシェーダー