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

理解する必要があるのは、Adjacency を使用してプリミティブ型を使用する場合 (例: GL_LINE_STRIP_ADJACENCY
)、実際にはインデックス バッファーに追加のデータを提供する必要があるということです。
図の点線が見えますか? これらは、インデックス バッファーに挿入する必要がある追加のインデックスです (または、インデックス付きの描画コマンドを使用していない場合は、単に追加の頂点として)。
ライン ストリップのみに関心があるため、ケースのインデックス作成は非常に簡単です。
ライン ストリップの最初と最後に追加のインデックスを追加して、隣接する頂点情報 (上の図では0と5として示されています) を提供します。
たとえば、次の (インデックス付きの) ライン ストリップがあるとします。
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 仕様の説明に従います。
i
+ 2番目の頂点から+ i
3番目の頂点まで、それぞれi
= 0, 1, . . . 、n
− 1 で、n
+ 3 個の頂点が渡されます。頂点が 4 つ未満の場合、すべての頂点が無視されます。線分i
の場合、i
+ 1番目とi
+ 4番目i
の頂点は、それぞれ+ 2番目とi
+ 3番目の頂点に隣接していると見なされます (図10.3を参照) 。