OpenGL Shading Language 4.60 Specification 読書ノート Part 2

仕様書該当部分

2. Overview of Shading

OpenGL Shading Language は、実際にはいくつかの密接に関連した言語からなる。これらの言語は、API の処理パイプラインに含まれるプログラム可能処理器のそれぞれに対応するシェーダーを作成するために用いられる。現在、これらの処理器とは、次の各処理器だ:

  • 頂点

  • 細分化制御

  • 細分化評価

  • 幾何

  • 断片

  • 計算

本稿では、特に断りのない限り、言語機能はすべての構成言語に適用され、一般的にはこれらの言語を(まとめて)一つ言語と呼ぶことにする。個別の言語は、対象とする(上で列挙しておいた)処理器の名前で呼ぶ。

API 状態のほとんどは追跡されず、シェーダーでは利用できない。一般的に、ユーザー定義の変数は、API パイプラインの異なる段階間の通信に用いられる。しかし、状態のうちのいくらか少しは追跡され、シェーダーが自動的に利用できるようになっており、いくつかの組み込み変数がパイプラインの異なる段階間のインターフェイスとなるように用意されている。

2.1. Vertex Processor

頂点処理器 (the vertex processor) とは、入力頂点とその関連データを処理するプログラム可能構成単位だ。この処理器上で動作するように OpenGL Shading Language で記述されたコンパイル単位を 頂点シェーダー (vertex shaders) と呼ぶ。

一連の頂点シェーダーのコンパイルとリンクが成功すると、頂点処理器上で動作する 頂点シェーダー実行形式 (a vertex shader executable) が出力される。

頂点処理器は一度に頂点を一つ操作する。一度に複数の頂点の情報を必要とするグラフィックス操作を置き換えるものではない。

2.2. Tessellation Control Processor

細分化制御器 (the tessellation control processor) とは、入力頂点とその関連データのパッチを操作して、新しい出力パッチを発するプログラム可能構成単位だ。この処理器上で動作するように OpenGL Shading Language で記述されたコンパイル単位を、 細分化制御シェーダー (tessellation control shaders) と呼ぶ。細分化制御シェーダーの集合が正常にコンパイルおよびリンクされると、細分化制御器上で動作する 細分化制御シェーダー実行形式 (a tessellation control shader executable) が得られる。

細分化制御シェーダーは、出力パッチの各頂点に対して呼び出される。各呼び出しは、入力パッチまたは出力パッチの任意の頂点の属性を読み取ることができるが、対応する出力パッチの頂点に対する頂点ごとの属性しか書き込むことができない。シェーダーの呼び出しは、出力パッチのためのパッチごとの属性の集合をまとめて生成する。

細分化制御シェーダーの呼び出しすべてが完了した後、出力頂点とパッチ単位の属性が組み立てられ、後続のパイプライン段階で使用されるパッチが形成される。

細分化制御シェーダーの呼び出しは、ほとんど独立して実行され、相対的な実行順序は未定義だ。しかし、組み込み関数 barrier() を使えば、呼び出しを同期させることで実行順序を制御することができ、細分化制御シェーダーの実行を効果的に一連のフェーズに分割することができる。細分化制御シェーダーは、ある呼び出しが、同じフェーズの間に別の呼び出しによって書き込まれた頂点ごとまたはパッチごとの属性から読み取った場合や、二つの呼び出しが一つのフェーズで同じパッチごとの出力 32 ビット成分に異なる値を書き込もうとした場合、未定義の結果となる。

2.3. Tessellation Evaluation Processor

細分化評価処理器 (the tessellation evaluation processor) は、多角形基本形状分割生成器によって生成された頂点の位置やその他の属性を、入力頂点とその関連データのパッチを使って評価するプログラム可能構成単位だ。この処理器上で動作するように OpenGL Shading Language で記述されたコンパイル単位を 細分化評価シェーダー (tessellation evaluation shaders) と呼ぶ。細分化評価シェーダーの集合が正常にコンパイルおよびリンクされると、細分化評価処理器上で動作する 細分化評価シェーダー実行形式 (a tessellation evaluation shader executable) が得られる。

細分化評価実行形式の呼び出しのそれぞれが、細分化基本形状生成器によって生成された単一の頂点の位置と属性を計算する。実行形式は、入力パッチ内の任意の頂点の属性と、細分化基本形状内の頂点の相対的な位置である細分化座標を読み取ることができる。実行形式は、頂点の位置とその他の属性を書き込む。

読者ノート

原文の tessellation primitives を、点や線分や三角形の抽象概念だと思って読んでいる。Primitive - OpenGL Wiki 参照。

2.4. Geometry Processor

幾何処理器 (the geometry processor) とは、頂点処理後に組み立てられた基本形状に対して、入力頂点のデータを演算し、出力基本形状を形成する一連の頂点を出力するプログラム可能な構成単位だ。この処理器上で動作するように OpenGL Shading Language で記述されたコンパイル単位を 幾何シェーダー (geometry shaders) と呼ぶ。一連の幾何シェーダーのコンパイルとリンクが成功すると、幾何処理器上で動作する 幾何 シェーダー実行形式 (a geometry shader executable) が得られる。

幾何処理器上で実行可能な幾何シェーダーを一度呼び出すと、固定数の頂点を持つ宣言された入力基本形状を操作する。この単一の呼び出しは、宣言された出力基本形状型の基本形状に組み立てられ、後続のパイプライン段階に渡される可変数の頂点を放出することができる。

2.5. Fragment Processor

断片処理器 (the fragment processor) とは、断片値とその関連データを操作するプログラム可能な構成単位だ。この処理器上で動作するように OpenGL Shading Languageで記述されたコンパイル単位を 断片シェーダー (fragment shaders) と呼ぶ。一連の断片シェーダーのコンパイルとリンクが成功すると、断片処理器上で動作する 断片 シェーダー実行形式 (a fragment shader executable) が得られる。

断片シェーダーは断片の (x, y) 位置を変更することはできない。また、隣接する断片へのアクセスも許されない。断片シェーダーによって計算された値は、現在の API の状態と断片を生成した API 命令に応じて、最終的にフレームバッファーメモリーやテクスチャーメモリーの更新に用いられる。

2.6. Compute Processor

計算器 (the compute processor) とは、他のシェーダー処理器とは独立して動作するプログラム可能な構成単位だ。この処理器上で動作するように OpenGL Shading Language で記述されたコンパイル単位を 計算シェーダー (compute shaders) と呼ぶ。一連の計算シェーダーのコンパイルとリンクが成功すると、計算器上で動作する 計算シェーダー実行形式 (a compute shader executable) が得られる。

計算シェーダーは、断片シェーダーや他のシェーダー処理器と同様に、テクスチャー、バッファー、画像変数、不可分計数器などの多くの資源にアクセスできる。固定機能の出力は持っていない。グラフィックスパイプラインの一部ではなく、その目に見える副作用は、画像、格納バッファー、および不可分計数器の変更によるものだ。

計算シェーダーは 作業グループ (a workgroup) と呼ばれる、作業項目のグループに対して作用する。作業グループとは、同じコードを並行して実行する可能性のある、シェーダー呼び出しの集合体だ。作業グループ内の呼び出しは、共有変数を通じて同じ作業グループの他のメンバーとデータを共有することができ、同じ作業グループの他のメンバーと同期するためにメモリーおよび制御フローの障壁を設ける。