8

私はグラフィックプログラミングに比較的慣れていません。本を読んだり、チュートリアルをスキャンしたりしているので、これがばかげた質問だと思われる場合はご容赦ください。

私はdirectx11の基本を稼働させており、今は楽しみたいと思っています。当然のことながら、私はシェーダーパイプラインを頻繁に読んでいて、すでに魅了されています。リソースを無駄にすることなく、60分の1秒ごとに数万回実行するのに十分効率的でなければならない単純で小さなコードを書くというアイデアは、続行して混乱させる前に、概念を理解することを急いでいます。物事の。私が問題を抱えているのは、ピクセルシェーダーが実際に何をしているのかを把握することです。

頂点シェーダーは簡単に理解できます。オブジェクトの頂点を、位置やテクスチャ座標などのオブジェクトに関する情報を関連付ける均一なデータ構造に編成し、各頂点をシェーダーに渡して、変換マトリックスを使用して3Dから2Dに変換します。 。私がそれを理解している限り、私はそれをコーディングする方法を理解することができます。

しかし、ピクセルシェーダーは取得できません。私が得たのは、頂点シェーダーの出力がピクセルシェーダーの入力であるということです。それでは、ピクセルシェーダーにポリゴンの頂点の2D座標を渡すだけではないでしょうか。私が理解するようになったのは、ピクセルシェーダーが個々のピクセルを受け取り、それらに対して計算を実行して、色や照明などを決定することです。しかし、それが本当なら、どのピクセルですか?画面全体ですか、それとも変換された2Dポリゴン内にあるピクセルだけですか?

または私は何かを完全に誤解しましたか?

4

2 に答える 2

10

頂点シェーダーは簡単に理解できます。オブジェクトの頂点を、位置やテクスチャ座標などのオブジェクトに関する情報を関連付ける均一なデータ構造に編成し、各頂点をシェーダーに渡して、変換マトリックスを使用して3Dから2Dに変換します。 。

この後、プリミティブ(三角形または三角形の倍数)が生成され、クリップされます(Direct3D 11では、変換フィードバック、ジオメトリシェーダー、テッセレーションのおかげで、実際には少し複雑になります...しかし、それが何であれ、最後に三角形があります)。

これで、フラグメントが「生成」されます。つまり、単一の三角形が通常のグリッドを持つ小さなセルに分割され、頂点シェーダーの出力属性が3つの頂点に対する各グリッドセルの相対位置に従って補間され、「タスク」が設定されます。小さなグリッドセルごとにアップします。これらの各セルは「フラグメント」です(マルチサンプリングが使用されている場合、1つのピクセルに複数のフラグメントが存在する可能性があります1)。

最後に、これらすべての「タスク」に対して小さなプログラムが実行されます。これがピクセルシェーダー(またはフラグメントシェーダー)です。

補間された頂点属性を受け取り、オプションで均一な値またはテクスチャを読み取り、1つの出力を生成します(オプションで複数の出力を生成することもできます)。ピクセルシェーダーのこの出力は1つのフラグメントを参照し、その後破棄されるか(たとえば、深度テストのため)、フレームバッファーとブレンドされます。通常、同じピクセルシェーダーの多くのインスタンスが同時に並行して実行されます。これは、GPUをこのように実行する方が、シリコン効率と電力効率が高いためです。1つのピクセルシェーダーは、同時に実行されている他のピクセルシェーダーを認識しません。
ピクセルシェーダーは通常、グループ内で実行され(「ワープ」または「波面」とも呼ばれます)、1つのグループ内のすべてのピクセルシェーダーは、まったく同じ命令を同時に(異なるデータに対して)実行します。繰り返しになりますが、これにより、より少ないエネルギーでより安価な、より強力なチップを構築できます。




1この場合でも、フラグメントシェーダーは「セル」ごとに1回だけ実行されることに注意してください。マルチサンプリングは、(高解像度)深度テストに従って、計算値を高解像度の追加の「スロット」(サブサンプル)の1つに格納するかどうかを決定するだけです。画面上のほとんどのピクセルで、すべてのサブサンプルは同じです。ただし、エッジでは、一部のサブサンプルのみがクローズアップジオメトリで埋められますが、一部のサブサンプルは、それらの値を「背景」ジオメトリから遠ざけることができます。マルチサンプル画像が解決されると(つまり、「通常の」画像に変換されると)、グラフィックカードはこれらのサブサンプルの「混合」(最も簡単な場合は単純に算術平均)を生成します。これにより、エッジ以外のすべてが出力されます。いつもと同じで、エッジは「

于 2012-06-25T17:34:21.200 に答える
2

ピクセルシェーダーについてのあなたの理解は、「個々のピクセルを受け取り、それらに対して計算を実行して、色や照明などを決定する」という点で正しいです。

シェーダーが受け取るピクセルは、変換された2Dポリゴン(具体的には三角形)のラスタライズ中に計算された個々のピクセルです。したがって、頂点シェーダーは三角形の3つのポイントを処理しますが、ピクセルシェーダーは、三角形を「塗りつぶす」ピクセルを一度に1つずつ処理します。

于 2012-06-25T17:32:37.890 に答える