.jpg/500px-Phong-shading-sample_(cropped).jpg)

コンピュータ グラフィックスにおいて、シェーダとは、 3D シーンのレンダリング(シェーディングと呼ばれるプロセス)中に適切な明るさ、暗さ、色のレベルを計算するコンピュータ プログラムです。シェーダは、コンピュータ グラフィックスの特殊効果やビデオの後処理、およびグラフィックス プロセッシング ユニットでの汎用コンピューティングにおけるさまざまな専門機能を実行するように進化してきました。
従来のシェーダーは、グラフィックス ハードウェア上のレンダリング効果を非常に柔軟に計算します。ほとんどのシェーダーはグラフィックス プロセッシング ユニット(GPU) 用にコード化され (GPU 上で実行されます)、[1] 、これは厳密な要件ではありません。シェーディング言語はGPU のレンダリング パイプラインをプログラムするために使用されます。これは、一般的なジオメトリ変換とピクセル シェーディング機能のみを許可していた過去の固定機能パイプラインをほぼ置き換えました。シェーダーを使用すると、カスタマイズされた効果を使用できます。最終的なレンダリング イメージを作成するために使用されるすべてのピクセル、頂点、および/またはテクスチャの位置と色(色相、彩度、明度、コントラスト) は、シェーダーで定義されたアルゴリズムを使用して変更でき、シェーダーを呼び出すコンピューター プログラムによって導入された外部変数またはテクスチャによって変更することもできます。[要出典]
シェーダーは、映画の ポストプロセス、コンピューター生成画像、およびビデオ ゲームで、さまざまな効果を生み出すために広く使用されています。単純な照明モデル以外にも、シェーダーのより複雑な用途には、画像の色相、彩度、明度( HSL/HSV ) またはコントラストの変更、ぼかし、ライト ブルーム、ボリューム ライティング、法線マッピング(深度効果用)、ボケ、セル シェーディング、ポスタリゼーション、バンプ マッピング、歪み、クロマ キーイング(いわゆる「ブルー スクリーン/グリーン スクリーン」効果用)、エッジおよびモーション検出、およびデモシーンで見られるようなサイケデリック効果の生成などがあります。[説明が必要]
歴史
「シェーダー」という用語の使用は、1988年5月に最初に公開されたPixarのRenderManインターフェース仕様のバージョン3.0で一般に導入されました。 [2]
グラフィックス処理ユニットが進化するにつれ、OpenGLやDirect3Dなどの主要なグラフィックスソフトウェアライブラリがシェーダーをサポートするようになりました。最初のシェーダー対応GPUはピクセルシェーディングのみをサポートしていましたが、開発者がシェーダーの威力を認識するとすぐに頂点シェーダーが導入されました。プログラム可能なピクセルシェーダーを備えた最初のビデオカードは、2001年にリリースされたNvidia GeForce 3 (NV20)でした。 [3]ジオメトリシェーダーはDirect3D 10とOpenGL 3.2で導入されました。最終的に、グラフィックスハードウェアは統一されたシェーダーモデルに向かって進化しました。
デザイン
シェーダーは、頂点またはピクセルの特性を表すシンプルなプログラムです。頂点シェーダーは頂点の属性 (位置、テクスチャ座標、色など) を表すのに対し、ピクセル シェーダーはピクセルの特性 (色、 Z 深度、アルファ値) を表します。頂点シェーダーはプリミティブ内の各頂点に対して呼び出されます(テッセレーションの後でも可能です)。つまり、頂点が 1 つ入力され、(更新された) 頂点が 1 つ出力されます。各頂点は、最終的に画面に送信されるサーフェス (メモリ ブロック) 上に一連のピクセルとしてレンダリングされます。
シェーダーは、通常固定機能パイプライン(FFP)と呼ばれるグラフィックスハードウェアのセクションを置き換えます。この名前は、ライティングとテクスチャマッピングをハードコードされた方法で実行するため付けられました。シェーダーは、このハードコードされたアプローチに代わるプログラム可能な方法を提供します。[4]
基本的なグラフィックス パイプラインは次のとおりです。
- CPU は、命令 (コンパイルされたシェーディング言語プログラム) とジオメトリ データを、グラフィックス カード上にあるグラフィックス処理ユニットに送信します。
- 頂点シェーダ内でジオメトリが変換されます。
- ジオメトリ シェーダーがグラフィックス プロセッシング ユニット内にあり、アクティブな場合、シーン内のジオメトリの一部の変更が実行されます。
- テッセレーション シェーダがグラフィックス プロセッシング ユニット内にあり、アクティブな場合、シーン内のジオメトリを細分化できます。
- 計算されたジオメトリは三角形に分割されます(三角形に分割されます)。
- 三角形はフラグメント クワッドに分割されます (1 つのフラグメント クワッドは 2 × 2 フラグメント プリミティブです)。
- フラグメント クワッドはフラグメント シェーダーに従って変更されます。
- 深度テストが実行され、合格したフラグメントが画面に書き込まれ、フレーム バッファーにブレンドされる可能性があります。
グラフィック パイプラインは、これらの手順を使用して、3 次元 (または 2 次元) データを表示に便利な 2 次元データに変換します。通常、これは大きなピクセル マトリックスまたは「フレーム バッファー」です。
種類
一般的に使用されているシェーダーには 3 つのタイプ (ピクセル シェーダー、頂点シェーダー、ジオメトリ シェーダー) があり、最近ではさらにいくつかのタイプが追加されています。古いグラフィック カードはシェーダー タイプごとに個別の処理ユニットを使用しますが、新しいカードは統合シェーダーを備えており、あらゆるタイプのシェーダーを実行できます。これにより、グラフィック カードは処理能力をより効率的に使用できます。
2Dシェーダー
2D シェーダーは、コンピュータ グラフィックスの分野ではテクスチャとも呼ばれるデジタル画像に作用します。ピクセルの属性を変更します。2D シェーダーは、 3D ジオメトリのレンダリングに関与する場合があります。現在、2D シェーダーの種類はピクセル シェーダーのみです。
ピクセルシェーダー
ピクセル シェーダー (フラグメントシェーダーとも呼ばれる) は、各「フラグメント」の色やその他の属性を計算します。フラグメントとは、最大で 1 つの出力ピクセルに影響するレンダリング作業の単位です。最も単純な種類のピクセル シェーダーは、1 つの画面ピクセルを色値として出力します。複数の入力/出力を持つより複雑なシェーダーも可能です。[5]ピクセル シェーダーは、常に同じ色を出力するものから、照明値を適用するもの、バンプ マッピング、影、鏡面ハイライト、半透明などの現象を実行するものまで多岐にわたります。ピクセル シェーダーは、フラグメントの深度を変更したり ( Z バッファリング用)、複数のレンダリング ターゲットがアクティブな場合は複数の色を出力したりできます。3D グラフィックスでは、ピクセル シェーダーだけでは、シーンのジオメトリ (頂点データなど) を知らずに単一のフラグメントのみを操作するため、複雑な効果を生み出すことができません。ただし、ピクセル シェーダーは描画される画面座標を認識しており、画面全体のコンテンツがテクスチャとしてシェーダーに渡された場合は、画面と近くのピクセルをサンプリングできます。この技術により、ぼかしや、漫画/セル シェーダーのエッジ検出/強調など、さまざまな 2 次元後処理効果を実現できます。ピクセル シェーダーは、パイプライン内の任意の 2 次元画像 (スプライトまたはテクスチャ)の中間段階で適用することもできますが、頂点シェーダーでは常に 3D シーンが必要になります。たとえば、ピクセル シェーダーは、ラスタライズされたビデオストリームのポストプロセッサまたはフィルターとして機能できる唯一のシェーダーです。
3Dシェーダー
3D シェーダーは3D モデルやその他のジオメトリに作用しますが、モデルやメッシュの描画に使用される色やテクスチャにもアクセスする場合があります。頂点シェーダーは最も古いタイプの 3D シェーダーで、通常は頂点ごとに変更を行います。新しいジオメトリ シェーダーは、シェーダー内から新しい頂点を生成できます。テッセレーション シェーダーは最新の 3D シェーダーで、頂点のバッチに一度に作用して詳細を追加します。たとえば、実行時にモデルを三角形やその他のプリミティブの小さなグループに分割して、曲線や隆起などを改善したり、その他の属性を変更したりします。
頂点シェーダー
頂点シェーダーは最も確立された一般的な種類の 3D シェーダーであり、グラフィックス プロセッサに与えられた各頂点に対して 1 回実行されます。その目的は、仮想空間での各頂点の 3D 位置を、画面に表示される 2D 座標 (および Z バッファの深度値) に変換することです。[6]頂点シェーダーは、位置、色、テクスチャ座標などのプロパティを操作できますが、新しい頂点を作成することはできません。頂点シェーダーの出力は、パイプラインの次のステージ、つまりジオメトリ シェーダー (存在する場合) またはラスタライザーに送られます。頂点シェーダーを使用すると、 3D モデルを含むあらゆるシーンで、位置、動き、照明、色の詳細を強力に制御できます。
ジオメトリシェーダー
ジオメトリシェーダーはDirect3D 10とOpenGL 3.2で導入されました。以前はOpenGL 2.0以降で拡張機能を使用することで利用可能でした。[7]このタイプのシェーダーは、グラフィックスパイプラインの先頭に送信されたプリミティブから、点、線、三角形などの新しいグラフィックスプリミティブを生成できます。[8]
ジオメトリ シェーダー プログラムは、頂点シェーダーの後に実行されます。これらのプログラムは、プリミティブ全体を入力として受け取ります。隣接情報が含まれる場合もあります。たとえば、三角形を操作する場合、3 つの頂点がジオメトリ シェーダーの入力になります。シェーダーは 0 個以上のプリミティブを出力し、ラスタライズされて、そのフラグメントが最終的にピクセル シェーダーに渡されます。
ジオメトリ シェーダーの一般的な用途には、ポイント スプライトの生成、ジオメトリテッセレーション、シャドウ ボリュームの押し出し、およびキューブ マップへのシングル パスレンダリングなどがあります。ジオメトリ シェーダーの利点の典型的な実例としては、メッシュの複雑度の自動変更が挙げられます。曲線の制御点を表す一連のライン ストリップがジオメトリ シェーダーに渡され、必要な複雑度に応じてシェーダーは自動的に追加のラインを生成し、それぞれのラインが曲線のより正確な近似値を提供します。
テッセレーションシェーダー
OpenGL 4.0 および Direct3D 11 では、テッセレーション シェーダーと呼ばれる新しいシェーダー クラスが追加されました。これは、従来のモデルに 2 つの新しいシェーダー ステージを追加します。テッセレーション コントロール シェーダー (ハル シェーダーとも呼ばれる) とテッセレーション評価シェーダー (ドメイン シェーダーとも呼ばれる) です。これらを組み合わせると、実行時に数学関数に従って、より単純なメッシュをより細かいメッシュに細分化できます。関数はさまざまな変数に関連付けることができますが、最も顕著なのは、アクティブな詳細レベルのスケーリングを可能にするビュー カメラからの距離です。これにより、カメラに近いオブジェクトは細かいディテールを持つことができ、遠くにあるオブジェクトはメッシュが粗くなりますが、品質は同等に見えます。また、非常に複雑なメッシュをメモリからダウンサンプリングするのではなく、シェーダー ユニット内でメッシュを一度リファインできるようにすることで、必要なメッシュ帯域幅を大幅に削減できます。一部のアルゴリズムでは任意のメッシュをアップサンプリングできますが、他のアルゴリズムではメッシュ内の「ヒント」を使用して最も特徴的な頂点とエッジを指定できます。
プリミティブとメッシュシェーダー
2017年頃、AMD Vega マイクロアーキテクチャは、ジオメトリを処理するために必要なデータにアクセスできるコンピュートシェーダーに似た新しいシェーダーステージ(プリミティブシェーダー)のサポートを追加しました。[9] [10]
Nvidiaは2018年にTuringマイクロアーキテクチャでメッシュシェーダーとタスクシェーダーを導入しましたが、これらもコンピュートシェーダーをモデルにしています。[11] [12] Nvidia Turingは、Ampere RTX 30シリーズがリリースされる数か月前に、DirectX 12 Ultimate APIを介してメッシュシェーディングをサポートする世界初のGPUマイクロアーキテクチャです。[13]
2020年に、AMDとNvidiaは、DirectX 12 Ultimateを介してメッシュシェーディングをサポートするRDNA 2とAmpereマイクロアーキテクチャをリリースしました。[14]これらのメッシュシェーダーにより、GPUはより複雑なアルゴリズムを処理できるようになり、CPUからGPUに多くの作業がオフロードされ、アルゴリズムを集中的に使用するレンダリングでは、フレームレートやシーン内の三角形の数が1桁増加します。[15] Intelは、2022年第1四半期に出荷されるIntel Arc Alchemist GPUがメッシュシェーダーをサポートすると発表しました。[16]
レイトレーシングシェーダー
レイトレーシングシェーダーは、MicrosoftではDirectX Raytracing、Khronos GroupではVulkan、GLSL、SPIR-V、[17] AppleではMetalを介してサポートされています。
テンソルシェーダー
テンソルシェーダはNPUまたはGPUに統合されることがあります。テンソルシェーダは、 MicrosoftのDirectML、Khronos GroupのOpenVX、AppleのCore ML、GoogleのTensorFlow、Linux FoundationのONNXによってサポートされています。[18]
計算シェーダー
コンピュート シェーダーはグラフィックス アプリケーションに限定されず、GPGPUに同じ実行リソースを使用します。グラフィックス パイプラインで、たとえばアニメーションやライティング アルゴリズムの追加ステージ (タイル フォワード レンダリングなど) に使用される場合があります。一部のレンダリング API では、コンピュート シェーダーがデータ リソースをグラフィックス パイプラインと簡単に共有できます。
並列処理
シェーダーは、画面の領域内の各ピクセルやモデルの各頂点など、一度に多数の要素に変換を適用するように作成されます。これは並列処理に適しており、ほとんどの最新の GPU にはこれを容易にする複数のシェーダーパイプラインがあり、計算スループットが大幅に向上します。
シェーダーを使用したプログラミング モデルは、レンダリング用の高階関数に似ており、シェーダーを引数として受け取り、中間結果間に特定のデータフローを提供することで、データ並列性(ピクセル、頂点など) とパイプライン並列性(ステージ間) の両方を実現します。( map Reduceも参照)。
プログラミング
シェーダーをプログラムする言語は、対象環境によって異なります。OpenGL およびOpenGL ES の公式シェーディング言語はOpenGL Shading Language (GLSL) で、Direct3D の公式シェーディング言語はHigh Level Shader Language (HLSL) です。OpenGLと Direct3D の両方のシェーダーを出力するサードパーティのシェーディング言語であるCg は、 Nvidiaによって開発されましたが、2012 年以降は非推奨となっています。Apple は、 Metal フレームワークの一部としてMetal Shading Languageと呼ばれる独自のシェーディング言語をリリースしました。
GUIシェーダーエディター
Unity、Unreal Engine、Godotなどの最新のビデオ ゲーム開発プラットフォームには、実際のコードを必要とせずにシェーダーを作成できるノード ベースのエディターがますます多く含まれています。代わりに、接続されたノードの有向グラフがユーザーに提示され、ユーザーはさまざまなテクスチャ、マップ、数学関数を、拡散色、鏡面反射色と強度、粗さ/金属性、高さ、法線などの出力値に向けることができます。その後、自動コンパイルによって、グラフが実際のコンパイル済みシェーダーに変換されます。
参照
参考文献
- ^ 「LearnOpenGL - シェーダー」。learnopengl.com 。 2019年11月12日閲覧。
- ^ 「RenderMan インターフェース仕様」。
- ^ Lillypublished、Paul (2009 年 5 月 19 日)。「Voodoo から GeForce まで: 3D グラフィックスの素晴らしい歴史」。PC Gamer – www.pcgamer.com 経由。
- ^ 「ShaderWorks のアップデート - DirectX ブログ」2003 年 8 月 13 日。
- ^ 「GLSL チュートリアル – フラグメント シェーダー」。2011 年 6 月 9 日。
- ^ 「GLSL チュートリアル – 頂点シェーダー」。2011 年 6 月 9 日。
- ^ ジオメトリ シェーダー - OpenGL。2011 年 12 月 21 日に取得。
- ^ 「パイプライン ステージ (Direct3D 10) (Windows)」。msdn.microsoft.com。2021年 1 月 6 日。
- ^ 「Radeon RX Vega 発表: AMD が 499 ドルで 4K ゲーム パフォーマンスを約束 - Trusted Reviews」2017 年 7 月 31 日。
- ^ 「AMDのVegaアーキテクチャの幕が上がる」2017年1月5日。
- ^ 「NVIDIA Turing アーキテクチャの詳細」。2018 年 9 月 14 日。
- ^ 「Turing メッシュ シェーダーの紹介」。2018 年 9 月 17 日。
- ^ 「DirectX 12 Ultimate Game Ready ドライバーがリリースされました。9 つの新しい G-SYNC 互換ゲーミング モニターのサポートも含まれます」。
- ^ 「DirectX 12 Ultimate の発表」。DirectX開発者ブログ。2020 年 3 月 19 日。2021年5 月 25 日閲覧。
- ^ 「メッシュシェーディングによる Justice のリアルなライティング」。NVIDIA開発者ブログ。2021 年 5 月 21 日。2021 年5 月 25 日閲覧。
- ^ ライアン・スミス。「Intel Architecture Day 2021: Xe-HPG GPU アーキテクチャのプレビュー」。www.anandtech.com。
- ^ 「Vulkan Ray Tracing 最終仕様リリース」。ブログ。Khronos Group。2020年 11 月 23 日。2021 年 2 月 22 日閲覧。
- ^ 「NNAPI 移行ガイド | Android NDK」。Android Developers。2024年8 月 1 日閲覧。
さらに読む
- アップスティル、スティーブ (1990)。 『RenderMan コンパニオン:リアルなコンピュータグラフィックスのプログラマーガイド』。Addison-Wesley。ISBN 0-201-50868-0。
- Ebert, David S ; Musgrave, F. Kenton ; Peachey, Darwyn ; Perlin, Ken ; Worley, Steven (1994)。テクスチャリングとモデリング: 手続き型アプローチ。AP Professional。ISBN 0-12-228730-4。
- Fernando, Randima; Kilgard, Mark (2003)。 『CG チュートリアル:プログラム可能なリアルタイム グラフィックスの決定版ガイド』。Addison-Wesley Professional。ISBN 0-321-19496-9。
- Rost, Randi J (2004)。OpenGLシェーディング言語。Addison -Wesley Professional。ISBN 0-321-19789-5。
外部リンク
- OpenGLジオメトリシェーダ拡張
- Riemer の DirectX と HLSL チュートリアル: DirectX を使用した HLSL チュートリアル (サンプル コード多数)
- パイプライン ステージ (Direct3D 10)
