Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 使用几何体着色器的线带邻接_Opengl_Geometry Shader - Fatal编程技术网

Opengl 使用几何体着色器的线带邻接

Opengl 使用几何体着色器的线带邻接,opengl,geometry-shader,Opengl,Geometry Shader,所以,我一直在尝试用几何体着色器从线条带邻接基本体中绘制一个圆柱体,它适用于4个顶点,但我想使它可以应用于更长的线条带。问题是,在第四个顶点之后,它完全搞砸了。我知道基本体允许着色器访问邻接信息,但我不确定如何访问它,所以我的问题是: 如何使用邻接信息?对于具有相同绘图调用的多条线,是否可以执行此操作? 如果您能提供伪代码示例,我将非常感激。下图来自,但我觉得它比OpenGL规范中的图更好地表达了基本拓扑 您需要了解的是,当您使用带有邻接的基本类型(例如,GL\u LINE\u STRIP\u

所以,我一直在尝试用几何体着色器从线条带邻接基本体中绘制一个圆柱体,它适用于4个顶点,但我想使它可以应用于更长的线条带。问题是,在第四个顶点之后,它完全搞砸了。我知道基本体允许着色器访问邻接信息,但我不确定如何访问它,所以我的问题是:

如何使用邻接信息?对于具有相同绘图调用的多条线,是否可以执行此操作?


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

下图来自,但我觉得它比OpenGL规范中的图更好地表达了基本拓扑

您需要了解的是,当您使用带有邻接的基本类型(例如,
GL\u LINE\u STRIP\u adjacence
)时,实际上必须在索引缓冲区中提供额外的数据

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


您只对线条条感兴趣,因此您的案例很容易索引。 您将在线条带的开头和结尾添加一个额外索引,以提供相邻顶点信息(在上图中表示为05

例如,假设您有以下(索引)线条带:
0,9,36,4,52,1,8(7个索引,6行)
生产线:
您已经确定了以下端点邻接:
L-hand:45
右手:63
带邻接的线条带将被索引为:
[45],0,9,36,4,52,1,8[63](9个索引,**仍然**6行)
+顶点[45]和36与直线(第一条直线)相邻
+顶点52和[63]与直线(最后一行)相邻
如您所见,必须添加两个额外的索引(使用
[X]
表示),因为第一行和最后一行之前或之后没有顶点。这些索引不会在条带中形成线条,它们只是在未定义的地方填充邻接信息


访问几何体着色器中具有邻接性的线条条中相邻顶点的伪代码:
#版本330
//每个基本体4个顶点——2个用于直线(1,2),2个用于邻接(0,3)
中的布局(线与相邻);
//画线的标准票价
布局(线带,最大顶点=2)输出;
真空总管(真空){
//与当前正在处理的线相邻的两个顶点
[0]中的vec4 prev_vtx=gl_。gl_位置;
[3]中的vec4 next_vtx=gl_。gl_位置;
gl_Position=gl_in[1]。gl_Position;//直线中的第一个顶点
发射顶点();
gl_Position=gl_in[2]。gl_Position;//直线中的第二个顶点
发射顶点();
}
几何体着色器遵循OpenGL规范中给出的描述:

-10.1.12相邻的线条条。306 对于每个
i
=0,1,…,从
i
+第二个顶点到
i
+第三个顶点绘制线段<代码>n− 1,其中传递了
n
+3个顶点。如果顶点少于四个,则忽略所有顶点。对于线段
i
,将
i
+第一个和
i
+第四个顶点分别视为与
i
+第二个和
i
+第三个顶点相邻(参见 图10.3


可以,可以在图形调用中为多条线提供邻接信息。这就是线条带的含义——一系列相连的线条。正如我将在回答中解释的那样,除了条带中的第一行和最后一行之外,所有条带都内置了邻接信息。非常感谢您的回答,这正是我一直在努力解决的问题,并且一直很难弄清楚的。另外,您认为这是否可以用于基本体重新启动,或者几何体着色器会因为邻接而与重新启动索引混淆?@chromose:primitive restart应该与邻接一起使用。但重新启动后仍需要4个顶点。所以你可以把一条相邻的带分成两条,像这样:3,5,6,7,-1,4,8,9,10。这将画出两条线(并且,假设您使用-1作为重新启动索引)。这也是我的想法,但每当我启用primitive restart时,它就会停止渲染邻接原语,尽管我认为我可能做错了什么,所以我将尝试再次尝试,并将结果发回。再次感谢你的回答。