因此,我一直在尝试使用几何着色器从线带邻接图元中绘制一个圆柱体,它适用于 4 个顶点,但我想将其应用于更长的线带。问题是,它在第四个顶点之后完全混乱了。我知道原语使着色器可以访问邻接信息,但我不确定如何访问它,所以我的问题是:
如何使用邻接信息?而且,是否可以使用相同的绘图调用对多条线执行此操作?
如果你能提供它,我将非常感谢伪代码示例。
因此,我一直在尝试使用几何着色器从线带邻接图元中绘制一个圆柱体,它适用于 4 个顶点,但我想将其应用于更长的线带。问题是,它在第四个顶点之后完全混乱了。我知道原语使着色器可以访问邻接信息,但我不确定如何访问它,所以我的问题是:
如何使用邻接信息?而且,是否可以使用相同的绘图调用对多条线执行此操作?
如果你能提供它,我将非常感谢伪代码示例。
下图来自D3D10 文档,但我觉得它比 OpenGL 规范中的图更好地传达了原始拓扑。
您需要了解的是,当您使用具有邻接关系的原始类型(例如 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)
如您所见,[X]
必须添加 2 个额外的索引(使用 表示),因为否则第一行和最后一行将没有在它们之前或之后的顶点。这些索引不会在条带中形成线条,它们只是用来填充邻接信息,否则它会是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 Core Profile Specification - 10.1.12 Line Strips with Adjacency - p。306
对于每个= 0, 1, ,从
i
+ 2 nd顶点到i
+ 3 rd顶点绘制一条线段。. . , − 1,其中有+ 3 个顶点通过。如果少于四个顶点,则忽略所有顶点。对于线段,+ 1 st和+ 4 th顶点被认为分别与+ 2 nd和+ 3 rd顶点相邻(见图10.3)i
n
n
i
i
i
i
i