当前位置: 首页 > 知识库问答 >
问题:

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

宋俊民
2023-03-14

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

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

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

共有1个答案

逄嘉禧
2023-03-14

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

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

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

您将在线条带的起点和终点添加一个额外的索引,以提供相邻顶点信息(在上图中表示为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]表示),因为第一行和最后一行之前或之后没有顶点。这些索引不会在条带中形成线条,它们只是用来填充邻接信息,否则邻接信息将无法定义。

#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规范中给出的描述:

i2nd顶点到i3rd顶点绘制线段,每个i=0,1, . . . , n−1,其中有n3个顶点传递。如果顶点少于四个,则忽略所有顶点。对于线段ii1sti4th顶点被认为与i2nd相邻i分别为3个rd顶点(见图10.3)

 类似资料:
  • 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。 废话不多说,我们直接先看一个几何着色器的例子: #version 330 core layout

  • 使用GLE管材和挤出库(http://www.linas.org/gle/)我能够使用OpenGL将2D计数挤出到3D对象中。该库在CPU上完成所有工作,并使用OpenGL即时模式。 我想在GPU上使用几何着色器进行挤压可能会更快,尤其是在渲染大量几何图形时。因为我还没有在OpenGL中使用几何着色器的任何经验,我想知道这是否可能,以及我必须注意什么。您认为将这些计算转移到GPU并提高性能是个好主

  • 我用C SDL2 GLEW Opengl 4.1编程一个小的体素游戏,有点像Minecraft。 我正在尽可能优化体素渲染。 我把世界滑成一块块,而这块块又滑成一块块。 每个块包含16x16x16个块。 现在,如果编辑块(删除/放置块),我将重建完整块和相邻块,并将其与vao和vbo一起上载到图形卡。 现在,为了最小化顶点数据,我必须从cpu传输到gpu,我使用几何体着色器。 首先,这是个好主意吗

  • 我正在尝试制作一个几何体着色器(使用着色器生成器)来简化模型。首先,我试图做一个体素化,但结果不好,我找不到它的错。 在下面的代码中,想法是找到输入三角形的中心,然后使其成为我要创建的框的中心。 我知道这不是世界上最优雅的代码,但先走一步,我需要让它工作...

  • 我似乎无法理解从顶点到像素的OpenGL管道过程。 有人能告诉我顶点法线在这两种着色技术中有多重要吗?据我所知,在gouraud中,在每个顶点计算照明,然后在顶点之间的多边形上插值结果颜色(在光栅化之前,这是在片段操作中完成的吗?),phong着色包括首先插值顶点法线,然后计算每个法线上的照明。 另一件事是,当凹凸贴图应用于一个平面(2个三角形)和一个砖纹理作为漫反射时,使用其相应的凹凸贴图,所有

  • 在我的第一个opengl“体素”项目中,我使用几何着色器从gl_points创建立方体,它工作得很好,但我相信它可以做得更好。在alpha颜色中,我传递关于应该渲染哪些面的信息(跳过与其他立方体相邻的面),然后使用“引用”立方体定义创建可见面的顶点。每个点乘以3个矩阵。直觉告诉我,也许整张脸可以乘以它们,而不是每一点,但是我的数学技能很差,所以请建议。 ------- 更新的代码:------