web-dev-qa-db-ja.com

頂点シェーダーとピクセルシェーダーとは何ですか?

頂点シェーダーとピクセルシェーダーとは何ですか?

それらの違いは何ですか?どれが最高ですか?

69
Paulo

ピクセルシェーダー は、ピクセル単位で動作し、ライティングやバンプマッピングなどを処理するようにプログラムできるGPU(グラフィック処理ユニット)コンポーネントです。

Vertex Shader もGPUコンポーネントであり、ピクセルシェーダーのような特定のアセンブリライクな言語を使用してプログラミングされていますが、シーンジオメトリに向けられており、オブジェクトに漫画のようなシルエットエッジを追加するなどのことができます。

どちらも他より優れているわけではなく、それぞれに特定の用途があります。 DirectX 9以上をサポートする最新のグラフィックカードには、これらの機能が含まれています。

これらのことの使い方をよりよく理解するために、ウェブ上に複数のリソースがあります。 NVidiaとATIは、特にこのトピックに関するドキュメントの優れたリソースです。

44
Scott Evernden

DirectX 10およびOpenGL 3では、3番目のタイプとしてGeometry Shaderが導入されました。

レンダリングパイプラインの順序で-

頂点シェーダー-単一のポイントを取り、それを調整できます。複雑な**頂点ライティング計算を次のステージのセットアップとして使用したり、周囲のポイント(ゆらぎ、スケールなど)をワープしたりできます。

結果の各プリミティブはに渡されます

Geometry Shader-変換された各プリミティブ(三角形など)を取得し、計算を実行できます。これにより、必要に応じて新しいポイントを追加したり、削除したり、移動したりできます。これを使用して、単一のベースメッシュから詳細レベルを動的に追加または削除したり、ポイントに基づいて数学的なメッシュを作成したり(複雑なパーティクルシステムの場合)、その他の同様のタスクを実行できます。

結果の各プリミティブはスキャンラインに変換され、スパンがカバーする各ピクセルは

ピクセルシェーダー(OpenGLのフラグメントシェーダー)-頂点シェーダーが渡すもの、バインドされたテクスチャ、およびユーザーが追加したデータに基づいて、画面上のピクセルの色を計算します。これは現在の画面をまったく読み取ることができず、そのピクセルが現在のプリミティブに対してどの色/透明度でなければならないかを解決します。

それらのピクセルは、現在の描画バッファー(画面、バックバッファー、テクスチャへのレンダリングなど)に配置されます

すべてのシェーダーは、ワールドビューマトリックスなどのグローバルデータにアクセスでき、開発者は単純な変数を渡して、ライティングやその他の目的に使用できます。シェーダーはアセンブラーに似た言語で処理されますが、最新のDirectXおよびOpenGLバージョンには、それぞれHLSLおよびGLSLと呼ばれる高レベルのc-like言語コンパイラが組み込まれています。 NVidiaには、両方のAPIで動作するCGと呼ばれるシェーダーコンパイラもあります。

[コメントに記載されているように、以前の誤った順序(ジオメトリ->頂点->ピクセル)を反映するように編集されました。]

現在、DirectX 11でテッセレーションに使用される3つの新しいシェーダーがあります。新しい完全なシェーダーの順序は、頂点->ハル->テッセレーション->ドメイン->ジオメトリ->ピクセルです。私はこれらの新しいものをまだ使用していませんので、それらを正確に説明する資格があるとは感じません。

62
Dan Brown

頂点シェーダーとピクセルシェーダーは、グラフィックパイプライン内で異なる機能を提供します。頂点シェーダーは、頂点関連データ(位置、法線、Texcoords)を取得して処理します。

ピクセル(より正確にはフラグメント)シェーダーは、頂点シェーダーで処理された値から補間された値を取得し、ピクセルフラグメントを生成します。 「クール」なもののほとんどは、ピクセルシェーダーで行われます。これは、テクスチャルックアップやライティングなどが行われる場所です。

11
geofftnz

DirectX固有:

シェーダー:

固定レンダリングパイプラインで定義されていないオブジェクトに追加のグラフィカル機能を実装するプログラムのセット。このため、ニーズに応じて独自のグラフィック効果を使用できます。つまり、定義済みの「修正済み」操作に限定されなくなりました。

HLSL:(高レベルシェーディング言語):

HLSLは、シェーダー(ピクセルシェーダー/頂点シェーダー)の実装に使用されるC++のようなプログラミング言語です。

頂点シェーダー:

頂点シェーダーは、グラフィックスカードのGPUで実行されるプログラムで、各頂点で個別に動作します。これにより、頂点を操作する独自のカスタムアルゴリズムを記述できます。

ピクセルシェーダー:

ピクセルシェーダーは、各ピクセルのラスタライズプロセス中にグラフィックカードのGPUで実行されるプログラムです。個々のピクセルに直接アクセス/操作する機能を提供します。このピクセルへの直接アクセスにより、マルチテクスチャリング、ピクセルごとの照明、被写界深度、クラウドシミュレーション、火災シミュレーション、高度なシャドーイングテクニックなど、さまざまな特殊効果を実現できます。

注:頂点シェーダーとピクセルシェーダー(プログラム)は両方とも、使用前に特定のバージョンのコンパイラーを使用してコンパイルする必要があります。コンパイルは、ファイル名、メインエントリ関数などの必須パラメーターを使用してAPIを呼び出すのと同じように実行できます。

5
SridharKritha

開発に関しては、ピクセルシェーダーは各ピクセルを個別に操作する小さなプログラムです。同様に、頂点シェーダーは各頂点を個別に操作します。

これらを使用して、特殊効果、影、照明などを作成できます。

各Pixel/Vertexは個別に動作するため、これらのshadersは、最新のグラフィックプロセッサの高度な並列アーキテクチャに適しています。

4
Stinomus