データ視覚化向けにグラフの描画速度を向上するシェーダー

シェーダーは、Arction のワークフローにとって重要な一部です。シェーダーは、グラフィック カードに対する計算処理の一部を担い、素晴らしい性能を達成するために使用されています。また、ハードウェアに非常に近いレベルでカスタマイズされた視覚化アルゴリズムを実装する機能も提供します。

GPU は、超並列ハードウェアの一例です。この能力を効率的に活用するには、データの並列計算が必要です。このシナリオに最適な方法がパイプライン処理です。これは、特定の問題に並列計算を適用する際に使用されます。次にケースを一般化し、有効な入力/出力パラメーターを含む特定のセットで細かいステップに分割できます。このようなパイプラインでは、データは段階ごとに順次に移動します。厳格なデータ フローにより、計算処理の自動並列化を効率的に実行できます。

これらは、計算パイプラインにおいてプログラミング可能な部分とプログラミング不可能な部分です。プログラミング可能なステップは、入力されたデータセット全体の隔離された部分にアクセスできる何らかの純粋関数によって表されます。さらに、初期化ステップの不変オブジェクトのセットにアクセスできます。プログラミング不可のステージは、パイプラインの一般的なロジックの一部を実装します。たとえば、計算ユニット間のデータ配布を管理します。

現在パイプライン処理は非常に一般的です。たとえば、Apache Hadoop (MapReduce) はパイプライン処理を使用して、コンピューターのクラスター上でビッグ データの分析を行います。マップ (ソート、フィルタリング)、シャッフル (マップ結果に沿ったデータセットの自動再配布)、およびリデュース (サマリー演算) の 3 つのステップに分けて計算します。優先度の高い順番に配列された関数の組み合わせにより、Apache Spark は、リアルタイムのデータ処理向けに非常にスケーラブルかつフォールトトレランスなカスタムのパイプラインを構築します。グラフィック パイプラインは、GPU アクセラレーターで加速されたコンピューター グラフィックの概念を応用しています。

グラフィック パイプライン

すべてのグラフィック ライブラリには、独自のグラフィック パイプラインが実装されています。共通の機能には、順序が固定された計算ステージがあります。パイプラインでプログラミング不可の部分は、固定機能と呼ばれています。プログラミング可能な部分は、シェーダーと呼ばれています。Arction では、DirectX 9 および 11 を使用しています。

現代のグラフィック ライブラリの計算パイプラインには、頂点、テッセレーション、ジオメトリ、ピクセル (フラグメント) の 4 種類のシェーダーが含まれています。通常シェーダーは、非常に簡単なシンタックスで特別に設計された C 言語のように実装されています。この言語の主な目的は、現実的な 3D 空間の視覚化向けに必要な計算の明確で効率的な宣言です。

グラフィック パイプラインは、頂点の集合体を入力として取得します。呼び出しを成功させるには、固定機能、シェーダーに対応するコード、およびコードの定数値向けにオプションをセットする必要があります。パイプライン処理の出力は、スクリーンに表示、またはテクスチャとして返還されます。

Implementation of Graphic Pipeline with LightningChart

シェーダーの種類

頂点シェーダー

このステージでは、頂点が 1 つ 1 つ処理されます。この処理には、それぞれの頂点で別々に行う必要がある演算が含まれます。シーンにおける頂点の回転、スケーリング、および配置は、演算の良い例です。通常、情報を保有する 3 つの行列で頂点のワールド座標を乗算して実行されます。頂点シェーダーは、他の種類のシェーダーよりも稀に実行されるため、そこでできる限り多くの処理を高速に実行できます。これにより、雷の計算など、より洗練されたタスク向けに使用されることがあります。このような決断は、性能にプラスの影響を与えますが、最終イメージに好ましくないアーチファクトを発生させる可能性があります。このため、この手法は 3D アプリケーションの主要部分に適していません。

テッセレーション

これは、プリミティブをより小さく分割することによって幾何学的形状を滑らかにするために使用されるグラフィック パイプラインの非常に新しい機能です。テッセレーション ステージには、2 つのシェーダーと 1 つの固定機能が含まれています。サブステージには、ハル シェーダー、テッセレーター、およびドメイン シェーダーがあります。希望の結果を得るには、3 つのサブステージすべてを同時に使用する必要があります。

ジオメトリ シェーダー

これは、簡単な 3D アプリケーションには必要ではありませんが、高度なケース向けに独自の可能性を広げる比較的新しいレンダリング パイプラインのステージす。頂点シェーダーとは対象的に、いくつかの頂点によって表される完全なジオメトリ プリミティブ上で演算を実行できます。つまり、パイプラインから頂点を変更、追加、および削除できます。これにより、入力ジオメトリを出力ジオメトリに変換できます。その結果、1 つの頂点を線、三角形、または複数のポリゴンで構成された複雑な形と置き替えることができます。この機能により、草、葉っぱ、雨、スプレー、およびその他のパーティクルベース効果を使用できるようになりました。

ピクセル シェーダー

ピクセルまたはフラグメント シェーダーは、レンダリング パイプラインのプログラミング可能な最後の部分です。ジオメトリのラスタ化終了後に実行され、各ポリゴンのそれぞれのピクセル向けの特定の情報を入手します。この値は、エリアをカバーする三角形に対応する頂点からのデータの補間によって計算されます。これは、ピクセルの色を正確に計算するのに最適な場所です。通常、正確な照明の計算に使用されますが、画像処理に使用されることもあります。現代のスクリーンでは多数のピクセルがあるため、各ピクセル特定の計算の一部は、最も負荷が掛かる傾向にあります。色に加えて、ステージの出力は三角形に対応する点の深度を含めることもできます。深度値は、出力マージで最終イメージを正確に編集するために必要です。

まとめ

この記事では、レンダリング パイプラインとシェーダーの概念について紹介しました。また、コンピューター グラフィック レンダリング向けの GPU アクセラレーションの利点についてもカバーしました。さらに、計算処理の並列化のための計算パイプラインの使用も紹介しました。是非、お客様のプロジェクトにご活用ください。

Arction 製品の詳細は、弊社製品ページをご覧ください。
製品に関する便利な情報は、リソース ページにて紹介しています。

記事参照:
2017年 5月 9日 Arction チーム
© Arction Ltd 2017
Introduction to Shaders