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

Writing vertex and fragment shaders

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

もしライティングに作用するシェーダーを書きたいなら、サーフェスシェーダーの記述 を参照してください。 また例を探している場合は、頂点とフラグメントシェーダーの例 を参照してください。ここでは、Unity のライトに関与しないシェーダー(例えば、スペシャルエフェクト、イメージエフェクト など) について説明します。

シェーダープログラムは Cg/HLSL 言語で書かれています。シェーダーテキストの Pass コマンドの中に「スニペット」が埋め込まれます。だいたい以下のような感じになります。

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

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

        // the Cg/HLSL code itself

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

Cg/HLSL スニペット

Cg/HLSL プログラムスニペットは CGPROGRAMENDCG 間に書かれます。

At the start of the snippet compilation directives can be given as #pragma statements. Directives indicating which shader functions to compile:

  • #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.

Other compilation directives:

  • #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 supports several rendering APIs (e.g. Direct3D 9 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:

  • 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
  • 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 コアテッセレーションのサーフェスシェーダー
頂点シェーダーとフラグメントシェーダーの例