6

そのため、ジオメトリ シェーダーを使用してライン ストリップ隣接プリミティブから円柱を描画しようとしましたが、4 つの頂点で機能しますが、より長いライン ストリップに適用できるようにしたいと考えています。問題は、4 番目の頂点の後で完全に台無しになることです。プリミティブがシェーダーに隣接情報へのアクセスを提供することは知っていますが、アクセス方法がわからないので、私の質問は次のとおりです。

隣接情報をどのように使用しますか? そして、同じ描画呼び出しで複数の行に対してこれを行うことは可能でしょうか?

疑似コードの例を提供していただければ幸いです。

4

1 に答える 1

23

次の図はD3D10 のドキュメントから引用したものですが、OpenGL 仕様の図よりもプリミティブなトポロジをよく表していると思います。

                              http://i.msdn.microsoft.com/dynimg/IC520307.png

理解する必要があるのは、Adjacency を使用してプリミティブ型を使用する場合 (例: GL_LINE_STRIP_ADJACENCY )、実際にはインデックス バッファーに追加のデータを提供する必要があるということです。

図の点線が見えますか? これらは、インデックス バッファーに挿入する必要がある追加のインデックスです (または、インデックス付きの描画コマンドを使用していない場合は、単に追加の頂点として)。


ライン ストリップのみに関心があるため、ケースのインデックス作成は非常に簡単です。

ライン ストリップの最初と最後に追加のインデックスを追加して、隣接する頂点情報 (上の図では05として示されています) を提供します。

たとえば、次の (インデックス付きの) ライン ストリップがあるとします。

0,9,36,4,52,1,8   (7 indices, 6 lines)

Lines produced:

 <0,9>
   <9,36>
     <36,4>
        <4,52>
           <52,1>
              <1,8>

そして、次の終了隣接を決定しました。

L-hand: 45
R-hand: 63

隣接関係のあるライン ストリップは、次のようにインデックス付けされます。

[45],0,9,36,4,52,1,8,[63]   (9 indices, **still** 6 lines)

 + Vertices [45] and 36 are adjacent to line <0,9> (first line)
 + Vertices 52 and [63] are adjacent to line <1,8> (last line)

ご覧のように、2 つの余分なインデックス ( を使用して表示[X]) を追加する必要がありました。そうしないと、最初と最後の行の前後に頂点がないためです。これらのインデックスは、ストリップ内の行を形成しません。そうでなければundefinedになる隣接情報を埋めるためだけに存在します。


ジオメトリ シェーダーで隣接するライン ストリップ内の隣接する頂点にアクセスする擬似コード:

#version 330

// 4 vertices per-primitive -- 2 for the line (1,2) and 2 for adjacency (0,3)
layout (lines_adjacency) in;

// Standard fare for drawing lines
layout (line_strip, max_vertices = 2) out;

void main (void) {
  // The two vertices adjacent to the line that you are currently processing
  vec4 prev_vtx = gl_in [0].gl_Position;
  vec4 next_vtx = gl_in [3].gl_Position;

  gl_Position = gl_in [1].gl_Position; // First vertex in the line
  EmitVertex ();

  gl_Position = gl_in [2].gl_Position; // Second vertex in the line
  EmitVertex ();
}

ジオメトリ シェーダーは、OpenGL 仕様の説明に従います。

OpenGL 4.4 コア プロファイル仕様  -  隣接関係のある 10.1.12 ライン ストリップ  - p. 306

i+ 2番目の頂点から+ i3番目の頂点まで、それぞれi= 0, 1, . . . n− 1 で、n+ 3 個の頂点が渡されます。頂点が 4 つ未満の場合、すべての頂点が無視されます。線分iの場合、i+ 1番目i+ 4番目iの頂点は、それぞれ+ 2番目i+ 3番目の頂点に隣接していると見なされます (10.3を参照) 。

于 2014-12-14T18:26:27.077 に答える