Cgに関するチュートリアルをいくつか読んだことがありますが、はっきりしないことが1つあります。頂点シェーダーとフラグメントシェーダーの違いは正確には何ですか?そして、どのような状況で一方が他方よりも適していますか?
5 に答える
フラグメントシェーダーはピクセルシェーダーと同じです。
主な違いの1つは、頂点シェーダーが頂点の属性を操作できることです。これは、ポリゴンのコーナーポイントです。
一方、フラグメントシェーダーは、頂点間のピクセルがどのように見えるかを処理します。それらは、特定のルールに従って、定義された頂点間で補間されます。
例:ポリゴンを完全に赤にしたい場合は、すべての頂点を赤に定義します。頂点間のグラデーションなどの特定の効果が必要な場合は、フラグメントシェーダーでそれを行う必要があります。
別の言い方をすれば:
頂点シェーダーは、グラフィックパイプラインの初期段階の一部であり、モデル座標変換とポリゴンクリッピングの間のどこかにあると思います。その時点では、実際にはまだ何も行われていません。
ただし、フラグメント/ピクセルシェーダーはラスタライズステップの一部であり、画像が計算され、頂点間のピクセルが塗りつぶされるか「色付け」されます。
ここでグラフィックスパイプラインについて読むだけで、すべてが明らかになります:http: //en.wikipedia.org/wiki/Graphics_pipeline
頂点シェーダーはすべての頂点で実行され、フラグメントシェーダーはすべてのピクセルで実行されます。フラグメントシェーダーは、頂点シェーダーの後に適用されます。シェーダーGPUパイプラインリンクテキストの詳細
頂点変換は、グラフィックハードウェアパイプラインの最初の処理段階です。頂点変換は、各頂点に対して一連の数学演算を実行します。これらの操作には、頂点位置をラスタライザーで使用するための画面位置に変換すること、テクスチャリング用のテクスチャ座標を生成すること、頂点を照らしてその色を決定することが含まれます。
ラスタライズの結果は、一連のピクセル位置と一連のフラグメントです。プリミティブが持つ頂点の数と、ラスタライズされたときに生成されるフラグメントの数との間に関係はありません。たとえば、3つの頂点だけで構成される三角形は画面全体を占める可能性があるため、何百万ものフラグメントが生成されます。
以前、フラグメントが何であるかを正確に知らない場合は、フラグメントをピクセルと考えるように説明しました。ただし、この時点で、フラグメントとピクセルの区別が重要になります。ピクセルという用語は「画像要素」の略です。ピクセルは、特定の場所にあるフレームバッファーの内容(色、深度、およびその場所に関連付けられているその他の値など)を表します。フラグメントは、特定のピクセルを更新するために潜在的に必要な状態です。
「フラグメント」という用語が使用されるのは、ラスタライズによって、三角形などの各幾何学的プリミティブが、プリミティブがカバーするピクセルごとにピクセルサイズのフラグメントに分割されるためです。フラグメントには、関連付けられたピクセル位置、深度値、および色、2次(鏡面)色、1つ以上のテクスチャ座標セットなどの補間されたパラメーターのセットがあります。これらのさまざまな補間パラメータは、フラグメントの生成に使用される特定の幾何学的プリミティブを構成する変換された頂点から導出されます。フラグメントは「潜在的なピクセル」と考えることができます。フラグメントがさまざまなラスター化テストに合格すると(ラスター操作段階で、これについては後で説明します)、フラグメントはフレームバッファー内のピクセルを更新します。
頂点シェーダーとフラグメントシェーダーはどちらも、固定パイプラインレンダリングを使用しない3D実装の機能です。3Dレンダリングでは、頂点シェーダーはフラグメント/ピクセルシェーダーの前に適用されます。
頂点シェーダーは各頂点で動作します。固定ポリゴンメッシュがあり、それをシェーダーで変形する場合は、頂点シェーダーで実装する必要があります。つまり、頂点の外観の物理的な変更は、頂点シェーダーで行うことができます。
フラグメントシェーダーは、頂点シェーダーからの出力を受け取り、色、ピクセルの深度値などを関連付けます。これらの操作の後、フラグメントは画面に表示するためにフレームバッファーに送信されます。
ライティング計算などの一部の操作は、フラグメントシェーダーだけでなく頂点シェーダーでも実行できます。ただし、フラグメントシェーダーは、頂点シェーダーよりも優れた結果を提供します。
3Dハードウェアを介して画像をレンダリングする場合、通常、メッシュ(ポイント、ポリゴン、ライン)があり、これらは頂点によって定義されます。通常、モデルのモーションや海の波に対して頂点を個別に操作するには、頂点シェーダーを使用できます。これらの頂点には、静的な色またはテクスチャによって割り当てられた色を設定して、フラグメントシェーダーを使用して頂点の色を操作できます。ビューが画面に表示されるパイプラインの最後で、フラグメントシェーダーを使用することもできます。