使用几何着色器的线条邻接

时间:2014-12-14 09:02:42

标签: opengl geometry-shader

所以,我一直在尝试使用几何着色器从线条邻接原语中绘制一个圆柱体,它适用于4个顶点,但我想这样做,我可以将它应用于更长的线条。问题是,它在第​​四个顶点之后完全混乱。我知道原语让着色器访问邻接信息,但我不知道如何访问它,所以我的问题是:

如何使用邻接信息?并且,是否可以使用相同的绘图调用对多行执行此操作?

如果您能提供伪代码示例,我将非常感谢。

1 个答案:

答案 0 :(得分:14)

下图来自D3D10 documentation,但我觉得它比OpenGL规范中的图表更能传达原始拓扑。

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

您需要了解的是,当您使用基本类型w / Adjacency(例如 GL_LINE_STRIP_ADJACENCY)时,您实际上必须在索引缓冲区中提供其他数据。

你看到图中的虚线了吗?那些是您必须插入索引缓冲区的 额外 索引(如果您没有使用索引绘图命令,则只是作为额外顶点)。


您只对线条感兴趣,因此您的案例索引非常简单。

您将在线条的开头和结尾添加一个额外的索引,以提供相邻的顶点信息(在上图中表示为 0 5 )。 / p>

比如说你有以下(索引)线条:

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 ();
}

Geometry Shader遵循OpenGL规范中给出的描述:

  

OpenGL 4.4 Core Profile Specification - 10.1.12带邻接的线条 - p。 306

     
    

对于每个{{1},从i + 2 nd 顶点到i + 3 rd 顶点绘制线段} = 0,1,。 。 。i - 1,其中传递了n + 3个顶点。如果顶点少于四个,则忽略所有顶点。对于线段ni + 1 st i + 4 th 顶点被认为与{{1}相邻分别为+ 2 nd i + 3 rd 顶点(见     数字 10.3