2012-02-02 10 views

答えて

6

フラグメントシェーダの頂点に直接アクセスする方法はなく、頂点シェーダは一度に1つの頂点しか扱わず、プリミティブ全体の概念を持ちません。フラグメントシェーダはフラグメントのみを処理します。

特定の頂点に関する情報を出力し、三角形の色をどのようにブレンドするか、またはテクスチャ座標をどのようにするかのように、フラグメントシェーダに補間することができます。とにかく、フラグメントシェーダでブレンドする必要があるので、頂点シェーダで自動的に行うこともできます。 3D空間座標をフラグメントにすることができます(しかし、フラグメントだけで、周囲の頂点ではありません)。

これで、シェイダーに任意の情報を添付することができます。たとえば、位置、法線、およびテクスチャに加えて、特定の頂点でアクセス可能にしたい各頂点に関する情報を持つ追加の属性を持つこともできます。もしあなたが望む情報であれば、x、y、z座標の3つのセットがあります。あなたが扱っているプリミティブのどの頂点番号(つまり、三角形の最初の2番目または3番目の頂点)および/またはシーケンス番号メッシュ全体でそれがあなたの望むものであれば、インデックス番号にすることもできます。余分なアトリビュートはプリミティブの各頂点の頂点データを複製して、フラグメントシェーダがその頂点の3つすべてから同じデータを持つようにするため、より多くのメモリを必要とします。例えば

(三角形プリミティブのための)各頂点の次の属性:

v1, n1, uv1, v1, v2, v3, 0 
v2, n2, uv2, v1, v2, v3, 1 
v3, n3, uv3, v1, v2, v3, 2 
v4, n4, uv4, v4, v5, v6, 0 
v5, n5, uv5, v4, v5, v6, 1 
v6, n6, uv6, v4, v5, v6, 2 

あなたは法線やテクスチャCOORDSが必要な場合は、あまりにもそれを複製する必要があります。

フラグメントシェーダの頂点情報で実際に何をしているのかを考えてみましょう。すべての頂点のデータを送信するのではなく、フラグメントシェーダで計算しようとしている箇所の答えを事前に計算し、その答えを属性としてアタッチし、頂点シェーダからフラグメントシェーダに渡って補間することができます。

もう1つの方法は、すべての頂点データを一様にダンプしてルックアップすることです。おそらく、頂点属性として添付されたある種のインデックス情報が必要になるでしょうが、どのインデックスが参照されるべきかを知っています。また、各ピクセルごとに起こっているため、ルックアップが遅くなることを覚えておいてください。各頂点は、周囲のものに関する情報を見るため、衝突が発生する可能性があります。

OpenGL(3.x +)の新しいバージョンでは、ジオメトリシェーダとテッセレーションシェイダーがこの種の情報にアクセスし、シェーダパイプラインの次のものに出力することができます。

これは、頂点データをフラグメントシェーダに渡す必要があるかどうかを知るために、達成しようとしていることを正確に知るのに役立つと述べています。また、フラグメントシェーダーでそのデータにアクセスすることなく、必要な作業を行うための方がはるかに簡単です。

2

フラグメントシェーダは実際に頂点シェーダへのリンクを持たず、頂点シェーダは頂点ごとにあり、そのジオメトリを作成した合計セットの概念はありません。したがって、最終的にフラグメントシェーダのインスタンスに上昇した頂点を取得することはできません。

達成しようとしている特定の効果はありますか?頂点から計算したいものは、通常、適切な変動をロードすることによって達成できます。各頂点の3d位置を適切な変化にロードすると、各フラグメントは本質的にその位置を知ることになります。