ピクセルシェーダー
[Wikipedia|▼Menu]

シェーダー(: shader)とは、3次元コンピュータグラフィックスにおいて、シェーディング(陰影処理)を行うコンピュータプログラムのこと。「shade」とは「次第に変化させる」「陰影・グラデーションを付ける」という意味で、「shader」は頂点色やピクセル色などを次々に変化させるもの(より具体的に、狭義の意味で言えば関数)を意味する。
概要

3DCGは様々な要素技術の集まりである。「物体」を三角形の集合で表現するモデリング、「動き」を計算するアニメーション・物理演算、「見た目」を生成するレンダリングなどである。その中でシェーダーはレンダリングの一部を担う。レンダリングは複数の段階からなるパイプライン(レンダリングパイプライン)で成っており、シェーダーはこのうちの「プログラム可能な部分」を意味する。例えば頂点シェーダーは頂点を入出力としてなんらかの処理を記述したものであり、例えばカメラを起点とする座標変換の記述に用いられる。

シェーダーはシェーディング言語を用いて記述される。頂点やピクセルが入出力に与えられ、座標変換/テクスチャマッピング/ライティングなどを含む任意の処理をプログラミングする。実行時には多くの場合シェーダープログラムはGPUへ引き渡され、頂点群やフラグメント群に対して並行的に呼び出されることで3DCGの「見た目」を生成する。

シェーダーはプログラムであるため、シェーディング言語と実行環境が許す任意の処理を記述できる。例えばピクセルシェーダーにおいて入力に含まれている色情報をすべて捨て去って真っ黒なピクセルを出力することも可能であるし、最新の研究に基づいた新しいライティングアルゴリズムを記述することもできる。シェーダーの用途(例: リアルタイムかプロダクションか、写実的かアニメ的か)によってシェーダーに記述される内容は異なり、これが3DCGの見た目の違いとなって現れる。
プロダクション用途のシェーダー

プロダクションレンダリングは、静止画あるいは動画の生成が最終目的であるが、動画の場合は複数枚の静止画をつなぎ合わせて最終的にコンポジットを行ない、動画を作り出す。

リアルタイム用途と比較すると、プロダクションレンダリングでは時間や資源の制約が少ない。例えば、映画作品の1シーンをレンダリングするために数時間から数日をかけ、高品質な映像を作り出してもかまわない。レンダリングのための膨大な一時情報(中間計算結果などのキャッシュデータ)がコンピュータの物理メモリに収まりきらない場合でも、ハードディスクなどの二次記憶領域に退避してレンダリングを続行することもできる。

プロダクション用途のシェーダーでは、時間はかかるが高品質でリアリティの高い結果を生成できる、レイトレーシングなどのより厳密な大域照明(グローバルイルミネーション)ベース・物理ベースの陰影計算モデルが用いられる。例えば、PIXARRenderManはグローバルイルミネーションをサポートしている[1]

また、物体同士の相互反射光の計算や、ある物体から別の物体へ投影されるシャドウ(影)の計算は、シーン内のライト(光源)の数に比例して時間がかかるようになるが、プロダクションレンダリングではデザイナーの望む数だけ自由に光源を配置することができる。
リアルタイム用途のシェーダー

ゲームなどのリアルタイムレンダリングでは、例えば60FPSの場合1フレームの描画にかけられる時間は最大でもわずか16ミリ秒程度であり、また頂点情報やテクスチャデータの格納・参照に使用できるビデオメモリ(グラフィックスカードに直結実装されたVRAM)の容量といった制約条件が多い[2]。そのため、リアルタイム用途のシェーダーでは、相互反射などを考慮しない、低品質だが簡潔で高速な局所照明(ローカルイルミネーション)ベースの陰影計算モデルやZバッファ技法が用いられることが大多数である。GPUの進化とリアルタイム用プログラマブルシェーダーの発展を受けて、アルゴリズムやデータ構造を工夫してグローバルイルミネーションをリアルタイム実装している例(PRT[3]、ライトフィールド[4]、ISPM[5]、SVO-GI法[6]NVIDIA GI WorksのCLIPMAP法[7]など)も出てきているが、高性能なハードウェアを要求するなど、2018年時点でも未だ発展途上の技術である。シャドウや多光源環境のライティングに関しても、CSM[8]/PSSM[9]といった種々のシャドウマップ派生技術、および遅延シェーディング・遅延ライティングなどが考案されているが、時間および資源の制約が足かせとなり、品質や柔軟性はプロダクションレンダリングに及ばない。

リアルタイム用途のシェーダーはしばしばCGプロダクションソフトウェアのプレビューにも用いられる。最終出力に必要な高資源・高品質なレンダリング(レンダリング方程式(英語版)に基づくレイトレーシングラジオシティフォトンマッピングなど)の代わりにリアルタイム用途のシェーダーを用いることで素早いプレビューが可能になる。例えばAutodesk 3ds MaxAutodesk MayaAutodesk Softimage、およびNewTek LightWave 3Dはいずれもプログラマブルシェーダーによるプレビューを実装している。また2DCGソフトウェアにもアクセラレータとしてしばしば導入される(例: Adobe PhotoshopAdobe Flash)。GUIベースオペレーティングシステム (OS) のデスクトップ合成エンジンや標準2DグラフィックスAPIでも、Windows Aero/Direct2D (Windows) やQuartz Extreme/Core Image (macOS) などのように、GPUおよびプログラマブルシェーダーが活用される。
シェーダーステージ

多くのリアルタイム用途グラフィックスパイプラインは複数段のプログラマブルシェーダーと固定処理からなっている。プログラム可能な1つの段階(シェーダー)はシェーダーステージと呼ばれる[10]。以下は典型的なシェーダーステージである。

表: シェーダーステージステージ名入力出力注記
頂点シェーダー頂点頂点
テッセレーション[11]プリミティブプリミティブしばしば "制御シェーダー" + "テッセレーション固定機能"
ジオメトリシェーダー[12]プリミティブプリミティブ
(ラスタライズ)プリミティブフラグメント固定機能
フラグメントシェーダーフラグメントフラグメント

OpenGL 3.2以降とDirect3D 10[13]以降では3種類のシェーダーを使用できる。
頂点シェーダー(バーテックスシェーダー)

頂点シェーダー(: Vertex Shader, VS)は主に入力頂点を座標変換(トランスフォーム)するための機能である。頂点シェーダーはオブジェクトを構成する頂点の集合(頂点配列、頂点バッファ)に対してのみ作用し、例えば3次元空間におけるXYZ位置座標法線ベクトル、色、テクスチャマッピング座標(UV座標など)といった頂点の属性だけを参照・変換できる。3次元グラフィックスにおける主な座標変換にはワールド変換、ビュー変換、プロジェクション変換、およびビューポート変換が存在するが、頂点シェーダーが担当するのはワールド・ビュー・プロジェクション変換である。ワールド・ビュー変換はモデル・ビュー変換とも呼ばれる。なお頂点単位のライティングであれば、頂点シェーダーで座標変換のほかにライティング計算を行なうこともできる。頂点シェーダーで計算された頂点情報はジオメトリシェーダーに渡されるか、そのままピクセルシェーダーに渡される。

Direct3D 9では頂点シェーダーをソフトウェアエミュレーションすなわちCPUで実行することもできるが(D3DCREATE_SOFTWARE_VERTEXPROCESSING)、プログラマブルシェーダー機能に対応しているハードウェア(GPU)であれば多数のプロセッサコアを使用して並列に処理を行なうことができるので、CPUで頂点シェーダーを実行するよりもGPUを利用した方が高速になる。

なお、シェーダーモデル3.0(DirectX 9.0c、OpenGL 2.x世代)で導入されたVertex Texture Fetch (VTF) [14]を使用すると、頂点シェーダーステージでテクスチャデータを参照することも可能となる。シェーダーモデル4.0(DirectX 10世代)以降では、VTFはバッファデータの参照とともに標準化されている[15](OpenGLは3.1でVTFを標準化し、バーテックスシェーダーで少なくとも16個のTIUを使えるようになっている)。さらに、OpenGL 4.2ではすべてのシェーダーステージにおいてイメージオブジェクトに対するロード/ストアを可能にする機能が標準化された[16]。DirectXにおいても、バージョン11.1にて、ピクセルシェーダーやコンピュートシェーダーだけでなく、すべてのシェーダーステージにおいて各種リソースに対する書き込みが可能になっている[17]
ジオメトリシェーダー

ジオメトリシェーダー(: Geometry Shader, GS)はピクセルシェーダーに渡されるオブジェクト内の頂点の集合を加工するために使用される。ジオメトリシェーダーにより、実行時に頂点数を増減させたり、プリミティブの種類を変更したりすることが可能となる。OpenGLではプリミティブシェーダーとも呼ばれる。

ジオメトリシェーダーはポイント、ライン、トライアングルといった既存のプリミティブから新しいプリミティブを生成できる。

ジオメトリシェーダーは頂点シェーダーの後に実行され、プリミティブ全体または隣接したプリミティブの情報を持つプリミティブを入力する。


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

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