ピクセルシェーダー
[Wikipedia|▼Menu]
ジオメトリシェーダーは頂点シェーダーの後に実行され、プリミティブ全体または隣接したプリミティブの情報を持つプリミティブを入力する。例えばトライアングルを処理するとき、3つの頂点がジオメトリシェーダーの入力となる。ジオメトリシェーダーはラスタライズされるプリミティブを出力でき、そのフラグメントは最終的にピクセルシェーダーに渡される。またプリミティブを出力せずにキャンセルすることもできる。

ジオメトリシェーダーのよくある使い方としては、ポイントスプライトの生成、ジオメトリテセレーション、シャドウボリュームの切り出し、キューブマップあるいはテクスチャ配列へのシングルパスレンダリングなどがある。
ピクセルシェーダー

ピクセルシェーダー(: Pixel Shader, PS)はピクセル単位のライティングやポストプロセス(後処理)を行なうための機能である。ピクセルシェーダーはラスタライズされるプリミティブの各ピクセルに影響する。また、ピクセルシェーダーにてテクスチャを参照することでバンプマッピングフォグ、シャドウ、ブルームといったエフェクトを最終レンダリング結果に適用することもできる。OpenGLではフラグメントシェーダー(: Fragment Shader, FS)と呼ばれる(Fragment: 断片)。

ピクセルシェーダーはピクセルを操作する機能であり、頂点シェーダーもしくはジオメトリシェーダーから入力された情報を元にテクスチャを合成したり表面色を適用したりする。ピクセルを操作する処理にかかる時間は入力プリミティブのラスタライズ後のピクセル数や出力解像度に左右されるため、通例は頂点単位の処理と比較して高負荷である。これをピクセルシェーダープログラムとしてプログラミングし、高い並列処理性能を持つGPUで実行することにより、バンプマッピング等のより高度なエフェクトをCPUですべて実行するよりもはるかに高いパフォーマンスで実現できる。なお、通常のレンダーターゲットを使ったピクセルシェーダーでは、アルファブレンド(アルファ合成)処理の詳細をプログラムすることはできない。
GPUパイプラインの概略

Direct3D 9世代までのGPUでは、頂点シェーダーおよびピクセルシェーダーを担当するハードウェアユニットの数はそれぞれ製品ごとに固定されていたが、Direct3D 10世代の統合型シェーダーアーキテクチャ(Unified Shader Architecture)では各シェーダーユニットが統合され、複数の汎用シェーダーユニットを使って上記3つのシェーダーステージに動的に振り分ける形となる[18] [19] [20] [21]

これらのシェーダーはGPUのパイプライン内で実行される。下記はパイプライン内にどのように埋め込まれているのかを示す例である。

CPUは命令とジオメトリデータをGPU側に送信する。

頂点シェーダー内でジオメトリを変換し、頂点単位ライティングの計算などを実行する。

ジオメトリシェーダーを使用する場合は、頂点シェーダーが出力したジオメトリに対してプリミティブ増減や変更を行なう。

これまでの処理で計算されたジオメトリをトライアングルセットアップに設定する。トライアングルはquadに変換される(1つのquadは2 × 2ピクセルのプリミティブである)。

ピクセルシェーダーを適用し、ピクセル単位ライティングなどを実行する。

視界判定を実行する。もし視界内にある場合はフレームバッファにピクセルを書き込む。

頂点シェーダー/ジオメトリシェーダーの出力をラスタライザーおよびピクセルシェーダーに渡すのではなく、バッファやテクスチャなどのメモリリソースに書き出した後、インプットアセンブラーや頂点シェーダー/ジオメトリシェーダーに再入力する、ストリームアウトプットという機能も存在する[22](OpenGLにはトランスフォームフィードバックと呼ばれる類似機能が存在する)。ストリームアウトプットはこれまでのようにGPU側でデータを参照するだけでなく、GPU自身が書き換えたデータを(CPUを介することなく)再利用することができるため、GPUパーティクルなどに応用できる[23]
テッセレーションシェーダー

OpenGL 4.0以降とDirect3D 11以降ではさらにテッセレーションシェーダーをオプションとして使用できる。詳細は「テッセレーション」を参照
歴史

RenderMan Shading Languageに代表されるように、プロダクション向けの3次元コンピュータグラフィックスのレンダリングでは古くからシェーディング処理をプログラムで記述してカスタマイズし、高品質な映像を作り出すといったことは当たり前のように行なわれてきた。一方でCADソフトやゲームなどのリアルタイム 2D/3Dグラフィックス アプリケーション開発者は、ソフトウェア(CPU)による定形の簡易シェーディングあるいはグラフィックスハードウェア(グラフィックスカードにおけるGPU)に固定機能として実装されていた頂点変換・シェーディング機能(ハードウェアT&L)すなわち「定形のパイプライン」(固定機能パイプライン)を使用してグラフィック表示を行なっていた[24]

しかし、多数のグラフィック表現技術が次々と開発されていく中で、それらの技術をGPUメーカーが逐一ハードウェアに機能として実装していく形態は非効率であり、またユーザープログラマーが新しい技術を試すにはメーカーの対応を待たねばならなかった。この問題を解決するアイディアとして、GPUのパイプラインをソフトウェアプログラムにより組み立てる「プログラマブル パイプライン」と呼ばれるアーキテクチャが構築されることになる。以前は完全にブラックボックスだったグラフィックスパイプラインがユーザープログラマーに対して開放されることで、新たな陰影処理技法や各種エフェクト(画面効果)を試験的に実装してGPU上で走らせることが容易になり、先進的なGPUの機能を利用する優れた柔軟性と、表現力の爆発的な向上がもたらされた。

当時のOpenGL・DirectX (Direct3D) のAPIによってブラックボックスとして提供されていたシェーダーは固定機能シェーダーと呼ばれ、プログラマブルシェーダーと区別される。OpenGLにおいてはバージョン1.5からプログラマブルシェーダーが拡張として導入され、バージョン2.0からは標準化された。Direct3Dにおいてはバージョン8からプログラマブルシェーダーが導入された[25]。OpenGL 3.1、OpenGL ES 2.0、およびDirect3D 10以降は固定機能シェーダーが廃止され、グラフィックスパイプラインはプログラマブルシェーダーによって記述される。現在ではリアルタイム処理系において「シェーダー」といえばプログラマブルシェーダーを指す[26] [27]


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:43 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef