シェーダ
出典: フリー百科事典『ウィキペディア(Wikipedia)』
コンピュータグラフィックスのシェーダは主にレンダリングを実行するためにグラフィックリソースに対して使用するソフトウェア命令の組み合わせである。3Dのアプリケーション開発者はGPUの「プログラマブルパイプライン」をプログラムするのにシェーダを使用し、先進的なGPUのプログラム化機能を利用する優れた柔軟性がもたらされ、古い「定形のパイプライン」はほぼ無くなった。
目次 |
[編集] 解説
技術的な視点から見るとシェーダは(オブジェクトの位置を計算するのとは違い)オブジェクトの色の計算を担当するレンダラーの一部である。
GPUがシェーダ機能を強化するにつれ、OpenGLやDirectXといった主なグラフィックライブラリはAPIに専用のシェーディング機能を備えるようになった。OpenGLはバージョン1.5で、DirectXはバージョン8でシェーダが導入された。
[編集] シェーダの種類
DirectXとOpenGLでは3種類のシェーダを使用できる。
- バーテックスシェーダ(頂点シェーダ)は頂点の集合に対してのみ作用し、位置、色、テクスチャ座標といった頂点の属性だけを変更できる。バーテックスシェーダで計算された頂点は通常はジオメトリシェーダに渡される。
- ジオメトリシェーダはピクセルシェーダに渡されるオブジェクト内の頂点の集合を加工するために使用する。
- ピクセルシェーダは既存のプリミティブの各ピクセルに影響し、バンプマッピングやフォグといったエフェクトをテクスチャに適用する。
DirectX 10のUnified shader model(統合シェーダモデル)は上記3つのシェーダーを統合する。NVIDIAのFAQを参照のこと。
これらのシェーダはGPUのパイプライン内で実行される。下記はパイプライン内にどのように埋め込まれているのかを示す例である。
[編集] GPUパイプラインの概略
- CPUは命令とジオメトリデータをグラフィックカードのGPUに送信する。
- バーテックスシェーダ内でジオメトリを変換しライティングの計算などを実行する。
- GPUにジオメトリシェーダが搭載されている場合はここでシーン内のジオメトリの変更を行う。
- これまでの処理で計算されたジオメトリをトライアングルセットアップに設定する。トライアングルはquadに変換される(1つのquadは2 × 2ピクセルのプリミティブである)。
- ピクセルシェーダを適用する。
- 視界判定を実行する。もし視界内にある場合はフレームバッファにピクセルを書き込む。
[編集] 並列処理
シェーダは同時に膨大な要素の集合に対して変換を適用するように記述される。例えばスクリーンの特定の範囲内の各ピクセルに対して、あるいはモデル内の全ての頂点に対して等である。これは並列処理に非常に適しており、多くの先進的なGPUではこれを促進するべくマルチコア設計となっており、処理効率を大幅に改善している。
[編集] シェーダのプログラミング
OpenGLのバージョン1.5からはGLSLというC言語に似たシェーダ言語を利用できる。またNVIDIAが開発したCgというシェーダ言語のためのインターフェイスもあり、GLSLと似た構文になっている。
DirectXのシェーダはHLSLでプログラムするが、利用可能なシェーダプログラムの形式と機能はDirectXのバージョンによって異なる。
以下の表はDirectXバージョン間の関係を示している。
DirectX Version | Pixel Shader | Vertex Shader |
---|---|---|
8.0 | 1.0, 1.1 | 1.0 |
8.1 | 1.2, 1.3, 1.4 | 1.1 |
9.0 | 2.0 | 2.0 |
9.0a | 2_A, 2_B | 2.x |
9.0c | 3.0 | 3.0 |
10.0 | 4.0 | 4.0 |
10.1 | 4.1 | 4.? |