2010-11-24 3 views
0

誰かがピクセルと頂点のシェーダのやりとりのかなりの基本を私に説明できますか?C++シェーダの最適化に関する質問

明白な事がは、実際のピクセルシェーダにそれらのいくつかを基本的な頂点のプロパティを受信し、repass頂点シェーダということです。

しかし実際のvertex->pixelの移行はどのように起こりますか? 明らかに、すべてのタイプのパイプラインには、頂点パラメータを補間することができ、特定のテクスチャ座標に基づいてテクスチャを適用できるラスタライザの変更が含まれていることがわかります。

そしては、私の知る限り、それらも補間さを理解して(この瞬間についてかなり確実ではない、複雑なUV派生数学について何かを聞いたが、私たちは、彼らが補間されていることを言うことができると仮定します)。


ここで、いくつかの「対象」となる質問があります。

ピクセルシェーダーはどのように動作しますか?私は、ピクセルシェーダが明らかにいくつかのアクションを行うことを意味します。ピクセルあたりですが、の明白な頂点→ピクセルトランジションにより、これはいくつかの質問をもたらします。

私はマトリックス評価された場合と仮定することができます - 私のピクセルシェーダで一度ベクトル積を画像がラスタライズされたとき、それは一度を評価されるでしょうか?または、頂点シェーダで可能なすべてを評価し、それをピクセルシェーダに渡す方がよいでしょうか?

また、誰かがこのトピックに関する記事や要約を指摘できれば、本当に感謝しています。

ありがとうございます。


UPDATE

私は相互作用がどこでもかなり同じである必要がありますので、それは実際には、重要ではありませんと思いました。私は視覚化アプリケーションとゲームを開発しています.HLSL/GLSL/Nvidia CGをシェーダとし、主にC++を基本言語として使用しています。

+0

によってカバーされた画素ごとに実行されていることをあなたが使用しようとしているものプラットフォーム/ APIを説明している場合は、より良い反応を得る可能性がありますを意味します。あなたは恐らくトピックタグか2つも欠けているでしょう。それが現れて、私はあなたが何を話しているのか分からない。 –

+0

@Noahアップデートを参照 –

+0

なぜこのタグはC++ですか?シェーダは、定義上、GLSLやCgなどのシェーダ言語で書かれていて、C++では書かれていませんか? – jalf

答えて

3

頂点シェーダは、すべての頂点に対して1回実行されます。頂点を世界の空間座標(または他の座標系にあるもの)からスクリーン空間座標に変換することができます。

つまり、三角形がある場合は、各頂点が変形されるため、画面上の位置になります。

これらの位置が与えられると、ラスタライザは、3つの頂点にまたがる三角形で覆われるピクセルを決定します。

そして、三角形の内側の各ピクセルについて、ピクセルシェーダが呼び出されます。頂点シェーダからの出力は、通常、各ピクセルごとに補間されるため、頂点v0に近いピクセルは、v0の頂点シェーダによって計算された値に非常に近い値を受け取ります。

そして、これはピクセルシェーダであなたが行うすべてを一度プリミティブされてラスタライズさ

+0

これに加えて、ピクセルシェーダよりもはるかに少ない頻度で実行されるため、頂点シェーダ内でできるだけ多くの機能を実行する必要があります。 – Flinsch

+0

場合によっては、CPU側のC++コードに操作を引き渡すこともできます。すべてのデータがどのくらいの頻度で変化するかによって異なります。三角形内のすべてのピクセルに共通の場合は、頂点シェーダに配置します。シェーダ全体に共通の場合は、定数としてシェーダの外側に配置します。 – jalf